У меня есть объект объектов, и я хочу знать, когда изменился подобъект.Я понимаю, как использовать __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
, чтобы я знал, какой элемент в корзине был изменен.