【问题标题】:Is it possible to monitor a list (or mutable sequence) for when a member of the list is modified?是否可以监视列表(或可变序列)何时修改列表成员?
【发布时间】:2015-02-15 06:39:30
【问题描述】:

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

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)

【问题讨论】:

  • 我记得函数装饰器是处理这个问题的一种方式。这可能是一个值得研究的方向。
  • 它是观察者设计模式,您可以通过快速搜索轻松找到有关它的资源。
  • 你想让它做什么?
  • @PadraicCunningham 我已经更新了这个问题,以举一个简单的例子来说明我想要做什么。
  • 我认为类或静态方法实际上可能更接近你想要的

标签: python list sequence observer-pattern mutable


【解决方案1】:

如 cmets 中所述,您正在寻找 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 实例 - 它只需要知道它们是 observable 实例。以类似的方式,SimpleObject 不知道 SimpleList - 它只知道一些需要观察其状态的类(一个 observer - 因此得名模式)。

【讨论】:

    猜你喜欢
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 2021-10-20
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多