Как правильно изменить обнаружение изменений на внешнем объекте в python? - PullRequest
0 голосов
/ 28 января 2019

У меня есть объект объектов, и я хочу знать, когда изменился подобъект.Я понимаю, как использовать __setattr__ для примитивных типов, но не понимаю, как использовать его с объектами.Я предполагаю, что python использует точки, и это означает, что __setattr__ не вызывается для внешнего объекта после изменения элемента во внутреннем объекте.

class OuterChangeDetection(object):
    def __setattr__(self, key, value):
        super().__setattr__(key, value)
        print('OuterChangeDetection', key, value)


class InnerChangeDetection(object):
    def __setattr__(self, key, value):
        super().__setattr__(key, value)
        print('InnerChangeDetection', key, value)


class Fruit(InnerChangeDetection):
    def __init__(self, weight: int):
        self.weight = weight


class Vegetable(InnerChangeDetection):
    def __init__(self, weight: int):
        self.weight = weight


class Basket(OuterChangeDetection):
    apple: Fruit = Fruit(1)
    banana: Fruit = Fruit(2)
    potato: Vegetable = Vegetable(3)

    def remove_bananas(self):
        self.banana = None


if __name__ == '__main__':
    basket = Basket()
    basket.apple.weight *= 10
    basket.banana.weight *= 10
    basket.potato.weight *= 10

    basket.remove_bananas()

Вывод:

InnerChangeDetection weight 1
InnerChangeDetection weight 2
InnerChangeDetection weight 3
InnerChangeDetection weight 10
InnerChangeDetection weight 20
InnerChangeDetection weight 30
OuterChangeDetection banana None

Iтакже хотел бы вызвать OuterChangeDetection при изменении weight, чтобы я знал, какой элемент в корзине был изменен.

...