+ Нов въпрос
achobanov -4 Точки

## Задача от лекция 6: обектно ориентиран питон

Имам проблем с задачата, която се пише по време на лекцията. Стигам до там където като параметри на всички методи се дава " **kwargs " Програмата на Борис се подкарва и си работи, докато при мен - не

Грешка:

``````Traceback (most recent call last):
File "/home/alex/Documents/SoftUni/open_courses/python/lecture-6/drawing_python/draw_figures.py", line 64, in <module>
sys.exit(main())
File "/home/alex/Documents/SoftUni/open_courses/python/lecture-6/drawing_python/draw_figures.py", line 15, in main
figures = create_figures(input_data)
File "/home/alex/Documents/SoftUni/open_courses/python/lecture-6/drawing_python/draw_figures.py", line 33, in create_figures
c = Square(**f_info)
TypeError: __init__() got an unexpected keyword argument 'type'``````

Програма:

``````import json
import sys
import turtle

from drowing_objects.Figures.simple import Circle, Square

def main():
if len(sys.argv) < 2:
print("Usage: {} input-file.json".format(sys.argv[0]))
return 1

# try:
figures = create_figures(input_data)
draw_figures(figures)
# except Exception as e:
#     print("Invalid input file provided! Error: " + str(e))
#     return 2

with open(input_filename) as f:
return input_data

def create_figures(input_data: dict):
result =[]
for f_info in input_data:
figure_type = f_info['type']
if figure_type == 'square':
c = Square(**f_info)
result.append(c)
elif figure_type == 'circle':
c = Circle(**f_info)
result.append(c)
else:
print('Not supported figure: {}'.format(f_info['type']))

return result

def draw_figures(figures):
t = turtle.Turtle()
t.speed('fast')
for f in figures:
f.draw(t)
turtle.exitonclick()

if __name__ == "__main__":
sys.exit(main())``````

клас Figure:

``````# ??? Use of this file is ???
class Figure:

def __init__(self, **kwargs):
self.center_x = kwargs['center_x']
self.center_y = kwargs['center_y']
self.color = kwargs['color']

def __str__(self):
return 'Figure center: {}:{}, color: {}'.format(
self.center_x,
self.center_y,
self.color
)

def draw(self, turtle):
pass
``````

classes Circle, Square:

``````from drowing_objects.Figures.base import Figure

class Circle(Figure):

def __init__(self, **kwargs):
super().__init__(**kwargs)

def draw(self, turtle):
turtle.penup()
turtle.goto(self.center_x - self.radius, self.center_y)  # Locating a starting point for circle
turtle.pendown()
turtle.color(self.color)

class Square(Figure):

def __init__(self, **kwargs):
super().__init__(**kwargs)
self.side = kwargs['side']

def draw(self, turtle):
half_side = self.side / 2
left = self.center_x - half_side
top = self.center_y + half_side

turtle.penup()
turtle.goto(left, top)
turtle.pendown()
turtle.color(self.color)
turtle.forward(1)
turtle.setheading(270)  # point the turtle down
for _ in range(4):
turtle.forward(self.side)
turtle.left(90)``````

JSON:

``````[
{"type": "square", "center_x": 0, "center_y": 0, "side": 2, "color": "black"},
{"type": "square", "center_x": 0, "center_y": 0, "side": 100, "color": "red"},
{"type": "square", "center_x": 0, "center_y": 0, "side": 200, "color": "blue"},
{"type": "circle", "center_x": 0, "center_y": 0, "radius": 50, "color": "blue"},
{"type": "circle", "center_x": 0, "center_y": 0, "radius": 100, "color": "red"}
]``````

Вероятно е нещо много просто и очевидно, но прегледах кода пет пъти и не можах да разбера къде е проблема. Благодаря.

Тагове:
0
RoYaL SoftUni Team Trainer 6888 Точки

Ами не ти вярвам :) Бая код си пуснал, та може да съм изпуснал нещо, но **kwargs си работят дори и да слагаш допълнителни параметри.

```class Test:
def __init__(self, **kwargs):
self._test = kwargs['a']

def main():
arg = {"b": 123, "a": 333, "c": 666}
t = Test(**arg)
print(t._test)

if __name__ == '__main__':
main()```

При:

RoYaL@root ~ \$ python asd.py
333

0
achobanov -4 Точки

Заповядай: http://postimg.org/image/7k1xx9pan/

Иначе съм сложил целия код, защото едвам се ориентирам в тия обекти и искам да се подсигуря.

0
27/01/2016 03:46:29
RoYaL SoftUni Team Trainer 6888 Точки

Мда, май разбрах. Ако ги вкараш в един файл всичко е ток. Проблемът е с импортите и това, че казваш че наследяваш например Фигура, а всъщност то го разбира като модула фигура, не класа. Същото и за Square/Circle. Пробвай там където ги инстанцираш, да ги инстанцираш като Circle.Circle и Square.Square (най-вероятно си мисли, че файлът в който се намират, който се казва например Circle.py е модул, а в него има клас Circle и съответно трябва да зивикаш Модулът.Класът). Същото важи и когато наследяваш фигура

class Circle(Figure.Figure)

0
achobanov -4 Точки

Не е от това. Начинът по който ги инстансирам е правилен. Но отговорът ти ме навехна на проблема, който не е сред целия код. който съм дал, а във файловата система :). Дефакто импортвах друга версия на файловете. Така че - благодаря!

0