Итак, вот немного кода, чтобы лучше понять, что я пытаюсь сделать ( Пример из реальной жизни в конце ):
Допустим, есть некоторый класс низкого уровня :
class Low:
def __init__(self):
self.value = 10
и существует класс высокого уровня, в котором одним из его атрибутов является объект низкого уровня:
class High:
def __init__(self, LOW):
self._value = 5
self._LOW = LOW
# integer attribute
@property
def value(self):
return self._value
@value.setter
def value(self, new_value):
self._value = new_value
self.print_method()
def print_method(self):
print(self._value)
# object attribute
@property
def LOW(self):
return self._LOW
@LOW.setter
def LOW(self, NEW_LOW):
self._LOW = NEW_LOW
self.print_method_2()
def print_method_2(self):
print(self._LOW.value)
Так что если я хочу автоматически вызвать print_method()
, изменив value
из High
класса, который является целым числом, я могу сделать:
LOW = Low() # create Low level object
HIGH = High(LOW) # create High level object
HIGH.value = 100 # value is set to 100 -> and 100 will be printed (integer attribute change)
Аналогично, если я хочу вызвать print_method_2()
, изменив High's
атрибут объекта, который также является объектом, я могу сделать :
LOW = Low() # create Low level object
HIGH = High(LOW) # create High level object
LOW_2 = Low()
HIGH.LOW = LOW_2 # LOW is set to LOW_2 and 5 is printed (Object attribute change)
Но я не хочу делать это вручную. Я хотел бы отредактировать объект низкого уровня и автоматически вызвать print_method_2()
.
Что-то вроде:
LOW = Low()
HIGH = High(LOW)
LOW.value = 13 # automatically call print_method_2() in High -> print 13
В идеале этот объект низкого уровня должен быть атрибутом нескольких различных объектов высокого уровня, и всякий раз, когда он изменяется, все эти объекты высокого уровня должны меняться. Я знаю, что пользовательские объекты являются изменяемыми, поэтому это одно изменение объекта низкого уровня должно автоматически изменить все эти объекты высокого уровня. Есть идеи, как это сделать?
Пример из реальной жизни: Допустим, у меня есть класс Ground, который содержит данные о трехмерной земле. Этот объект является атрибутом объектов Grass, Trees, Rivers ... Все зависит от Земли. Поэтому, если я редактирую высоту Земли, я не хочу снова устанавливать Землю на объекты Трава, Деревья, Реки .... Я хочу, чтобы они обнаруживали изменения Основания и редактировали их автоматически.