Задача от лекция 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:
input_data = load_input_data(sys.argv[1])
figures = create_figures(input_data)
draw_figures(figures)
# except Exception as e:
# print("Invalid input file provided! Error: " + str(e))
# return 2
def load_input_data(input_filename):
with open(input_filename) as f:
input_data = json.load(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)
self.radius = kwargs['radius']
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)
turtle.circle(self.radius)
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"}
]
Вероятно е нещо много просто и очевидно, но прегледах кода пет пъти и не можах да разбера къде е проблема. Благодаря.
Заповядай: http://postimg.org/image/7k1xx9pan/
Иначе съм сложил целия код, защото едвам се ориентирам в тия обекти и искам да се подсигуря.
Мда, май разбрах. Ако ги вкараш в един файл всичко е ток. Проблемът е с импортите и това, че казваш че наследяваш например Фигура, а всъщност то го разбира като модула фигура, не класа. Същото и за Square/Circle. Пробвай там където ги инстанцираш, да ги инстанцираш като Circle.Circle и Square.Square (най-вероятно си мисли, че файлът в който се намират, който се казва например Circle.py е модул, а в него има клас Circle и съответно трябва да зивикаш Модулът.Класът). Същото важи и когато наследяваш фигура
class Circle(Figure.Figure)
Не е от това. Начинът по който ги инстансирам е правилен. Но отговорът ти ме навехна на проблема, който не е сред целия код. който съм дал, а във файловата система :). Дефакто импортвах друга версия на файловете. Така че - благодаря!