Софтуерно Инженерство
Loading...
+ Нов въпрос
achobanov avatar 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:
    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"}
]

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

Тагове:
0
Python
RoYaL avatar RoYaL SoftUni Team Trainer 6883 Точки

Ами не ти вярвам :) Бая код си пуснал, та може да съм изпуснал нещо, но **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 avatar achobanov -4 Точки

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

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

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

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

class Circle(Figure.Figure)

 

0
achobanov avatar achobanov -4 Точки

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

0