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 Trainer 6849 Точки

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

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

class Circle(Figure.Figure)

 

0
achobanov avatar achobanov -4 Точки

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

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.