假设我有一个非常简单的数据类型:
class SimpleObject:
def __init__(self, property):
self.property = property
def update_property(self, value):
self.property = value
我用一种特殊的列表来存储数据类型:
class SimpleList(collections.MutableSequence):
def update_useful_property_of_list(self, value):
self.useful_property_of_list = value
我存储它们:
simple1 = SimpleObject(1)
simple2 = SimpleObject(2)
simple_list = SimpleList([simple1, simple2])
SimpleList
对象有什么方法可以知道其成员的某个属性何时更改?例如,当发生这种情况时,如何让 simple_list
执行 self.update_useful_property_of_list()
:
simple1.update_property(3)
最佳答案
如评论中所述,您正在寻找 Observer design pattern .在您的示例中最简单的方法:
class SimpleObject:
def __init__(self, property, propertyChangeObserver = None):
self.property = property
self.propertyChangeObserver = propertyChangeObserver
def registerPropertyChangeObserver(self, propertyChangeObserver):
self.propertyChangeObserver = propertyChangeObserver
def update_property(self, value):
self.property = value
if self.propertyChangeObserver:
self.propertyChangeObserver.simpleObjectPropertyChanged(self)
和:
class SimpleList(collections.MutableSequence):
def __init__(self, collection):
super(SimpleList, self).__init__(collection)
for e in collection:
e.registerPropertyChangeObserver(self)
def simpleObjectPropertyChanged(self, simpleObject):
pass # react to simpleObject.property being changed
因为您将您的属性称为“属性”,所以很难在这里证明低耦合 :) 为了清楚起见,我将方法称为 simpleObjectPropertyChanged
,但实际上,SimpleList
不必知道它存储 SimpleObject
实例 - 它只需要知道它们是可观察的实例。以类似的方式,SimpleObject
不知道 SimpleList
- 它只知道一些需要观察其状态的类(>observer - 因此该模式的名称)。
关于python - 是否可以在修改列表成员时监视列表(或可变序列)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27513326/