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
свойство не доступно?