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

标签 python list sequence observer-pattern mutable

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

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/

相关文章:

python - 陷入无限循环

python - 创建 Python 字典

python - 如何使用嵌套列表的第一个元素打印字典键

algorithm - 序列覆盖算法

hibernate JPA : optional value generation

python - 视频捕获后整个帧旋转

python - Docker - "127.0.0.1"不是有效端口 - Django

python - 如何使用python将表单数据插入MYSQL

python - 对有限集中的符号列表进行编码的最紧凑方法是什么?

f# - 在 F# 中从具有 N 个不同索引的序列中取出 N 个元素