通知父实例有关属性更改的信息

2024-04-26 18:53:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两门课:

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

我是这样用的:

^{pr2}$

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


Tags: nameselfmessagereturnobjectinitvaluedef
2条回答

您必须将引用存储到父级;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

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

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"

输出为:

^{pr2}$

相关问题 更多 >