【问题标题】:Notify parent instance about property change通知父实例有关属性更改
【发布时间】:2013-05-13 15:24:15
【问题描述】:

我有这两个类:

class Status(object):
    def __init__(self):
        self._message = ''

    @property
    def message(self):
        return self._message

    @message.setter
    def message(self, value):
        self._message = value


class Buddy(object):
    def __init__(self, name):
        self.name = name
        self.status = Status()

    def status_updated(self):
        # this should be called when self.status.message is changed

我是这样使用它们的:

buddy = Buddy('John')
buddy.status.message = 'Hello world!'  # this should call Buddy.status_updated

我希望在修改Statusmessage 属性时调用Buddy.status_updated。如何做到这一点?

【问题讨论】:

    标签: python class oop properties setter


    【解决方案1】:

    你必须存储一个参考 back 到父级; python 值不跟踪它们的存储位置(可能有多个位置引用您的 Status() 实例):

    class Status(object):
        def __init__(self, parent=None):
            self._message = ''
            self._parent = parent
    
        @property
        def message(self):
            return self._message
    
        @message.setter
        def message(self, value):
            self._message = value
            if self._parent is not None:
                self._parent.status_updated()
    
    
    class Buddy(object):
        def __init__(self, name):
            self.name = name
            self.status = Status(self)
    
        def status_updated(self):
            # this should be called when self.status.message is changed
    

    【讨论】:

    • 我担心这会是答案。谢谢!
    • 另一种选择是使用某种事件系统(订阅者、事件发布者等)。
    【解决方案2】:

    在每种情况下,您都需要以某种方式注册您想要“监听”其他对象的属性更改。我会建议这样的简单解决方案:

    class Status(object):
        def __init__(self, on_message_change=None):
            self._message, self._on_message_change = '', on_message_change
    
        @property
        def message(self):
            return self._message
    
        @message.setter
        def message(self, value):
            if self._on_message_change:
                self._on_message_change(self._message, value)
            self._message = value
    
    
    class Buddy(object):
        def __init__(self, name):
            self.name = name
            self.status = Status(self.status_updated)
    
        def status_updated(self, old_value, new_value):
            print("status changed '%s' -> '%s'" % (old_value, new_value))
    
    b = Buddy("someone")
    b.status.message = "init"
    b.status.message = "new"
    

    输出是:

    status changed '' -> 'init'
    status changed 'init' -> 'new'
    

    【讨论】:

      猜你喜欢
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      • 2017-04-24
      • 1970-01-01
      相关资源
      最近更新 更多