Как автоматически вызвать метод объекта при изменении атрибута его атрибута (который также является объектом)? - PullRequest
1 голос
/ 15 января 2020

Итак, вот немного кода, чтобы лучше понять, что я пытаюсь сделать ( Пример из реальной жизни в конце ):

Допустим, есть некоторый класс низкого уровня :

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 ... Все зависит от Земли. Поэтому, если я редактирую высоту Земли, я не хочу снова устанавливать Землю на объекты Трава, Деревья, Реки .... Я хочу, чтобы они обнаруживали изменения Основания и редактировали их автоматически.

1 Ответ

0 голосов
/ 15 января 2020

Самый простой способ добиться этого - написать метод set для вашего HIGH-объекта, который устанавливает HIGH.LOW.value и вызывает ваш метод. Итак, что-то вроде этого:

class High:
    def setLowValue(value):
        self.LOW.value = value
        self.print_method_2()

Другим способом было бы реализовать некое подобие прослушивателя событий, который запускает событие при изменении значения. Но это также выходит за мои рамки в Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...