Почему свойство не доступно в Python? - PullRequest
0 голосов
/ 29 октября 2019

GenericWidget необходим для рендеринга низкоуровневых элементов, таких как квадраты или текст. У них есть предопределенный размер. Рендеринг описан в функции рендеринга. У класса Widget есть метод build, который должен возвращать виджеты, которые составляют виджет, который мы создаем. Контекст (родительский виджет) должен быть передан в метод сборки. Проблема в том, что когда вы пытаетесь получить размер виджета, возникает проблема, что параметр размера не существует.

Вот мой пример кода:

class Widget:
    def __init__(self, context):
        self.__context__ = context
        self.__update_instance__()

    def build(self, context):
        return NotImplemented

    def render(self, xy):
        self.__update_instance__()
        self.__instance__.render(xy=xy)

    def __update_instance__(self):
        self.__instance__ = self.build(context=self.__context__)
        self.size = self.__instance__.size


class GenericWidget(Widget):
    def __init__(self, size):
        self.size = size
        super(GenericWidget, self).__init__(self)

    def build(self, context):
        return self


class GenericTest(GenericWidget):
    def __init__(self):
        super(GenericTest, self).__init__(size=(10, 10))

    def render(self, xy):
        # all rendering core here
        pass


class Test2(Widget):
    def build(self, context):
        print(context.size)
        return GenericTest()


class Test(Widget):
    def build(self, context):
        return Test2(self)


class OwnWidget(Widget):
    def build(self, context):
        return Test(self)


class Spacer(GenericWidget):
    def __init__(self, size):
        super(Spacer, self).__init__(size=size)


OwnWidget(Spacer((100, 100))).render(xy=(0, 0))

Трассировка:

Traceback (most recent call last):
  File "test.py", line 57, in <module>
    OwnWidget(Spacer((100, 100))).render(xy=(0, 0))
  File test.py", line 4, in __init__
    self.__update_instance__()
  File "test.py", line 14, in __update_instance__
    self.__instance__ = self.build(context=self.__context__)
  File "test.py", line 49, in build
    return Test(self)
  File "test.py", line 4, in __init__
    self.__update_instance__()
  File "test.py", line 14, in __update_instance__
    self.__instance__ = self.build(context=self.__context__)
  File "test.py", line 44, in build
    return Test2(self)
  File "test.py", line 4, in __init__
    self.__update_instance__()
  File "test.py", line 14, in __update_instance__
    self.__instance__ = self.build(context=self.__context__)
  File "test.py", line 38, in build
    print(context.size)
AttributeError: 'Test' object has no attribute 'size'

Почему size свойство не доступно?

...