是否可以监视列表成员(或可变序列)何时修改列表成员?

drs*_*drs 8 python list mutable sequence observer-pattern

假设我有一个非常简单的数据类型:

class SimpleObject:
    def __init__(self, property):
        self.property = property

    def update_property(self, value):
        self.property = value
Run Code Online (Sandbox Code Playgroud)

我是一种特殊的列表来存储数据类型:

class SimpleList(collections.MutableSequence):
    def update_useful_property_of_list(self, value):
        self.useful_property_of_list = value
Run Code Online (Sandbox Code Playgroud)

我存储它们:

simple1 = SimpleObject(1)
simple2 = SimpleObject(2)

simple_list = SimpleList([simple1, simple2])
Run Code Online (Sandbox Code Playgroud)

有没有办法让SimpleList对象知道其成员的某个属性何时发生变化?例如,当这样的事情发生时,我怎样才能simple_list执行self.update_useful_property_of_list():

simple1.update_property(3)
Run Code Online (Sandbox Code Playgroud)

Bar*_*zKP 4

正如评论中所述,您正在寻找观察者设计模式。在您的示例中最简单的方法是:

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)
Run Code Online (Sandbox Code Playgroud)

和:

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
Run Code Online (Sandbox Code Playgroud)

因为您将您的属性称为“属性”,所以很难在这里展示低耦合:)simpleObjectPropertyChanged为了清楚起见,我已经调用了该方法,但实际上,SimpleList不必知道它存储SimpleObject实例 - 它只需要知道它们是可观察的实例。以类似的方式,SimpleObject不知道SimpleList- 它只知道一些需要观察其状态的类(观察者- 因此模式的名称)。