如何在python中对外部对象进行适当的更改检测?

2024-04-24 03:38:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个对象对象,想知道子对象何时发生了变化。我了解如何将__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

我还想在更改weight时触发OuterChangeDetection,以便知道篮子中的哪个元素已更改


Tags: 对象keyself元素valuedefclassbanana