如何在价值变化时触发功能?


问题内容

我意识到这个问题与事件处理有关,并且我已经了解了Python事件处理程序的调度程序,因此它要么没有回答我的问题,要么我完全错过了信息。

我希望每当值更改时都会触发m()对象的方法:A``v

例如(假设金钱使人高兴):

global_wealth = 0

class Person()
    def __init__(self):
        self.wealth = 0
        global global_wealth
        # here is where attribute should be
        # bound to changes in 'global_wealth'
        self.happiness = bind_to(global_wealth, how_happy)

    def how_happy(self, global_wealth):
        return self.wealth / global_wealth

因此,无论何时global_wealth更改值,该类的所有实例Person都应相应地更改其happiness值。

注意: 因为第一个版本似乎暗示我需要getter和setter方法,所以我不得不编辑问题。对困惑感到抱歉。


问题答案:

您需要使用观察者模式。在以下代码中,一个人订阅以接收来自全球财富实体的更新。当全球财富发生变化时,该实体随后会向其所有订户(观察者)发出发生变化的警报。然后,人更新自己。

在此示例中,我使用了属性,但是没有必要。一个小警告:属性仅适用于新样式类,因此必须使用类声明后的(对象)才能起作用。

class GlobalWealth(object):
    def __init__(self):
        self._global_wealth = 10.0
        self._observers = []

    @property
    def global_wealth(self):
        return self._global_wealth

    @global_wealth.setter
    def global_wealth(self, value):
        self._global_wealth = value
        for callback in self._observers:
            print('announcing change')
            callback(self._global_wealth)

    def bind_to(self, callback):
        print('bound')
        self._observers.append(callback)


class Person(object):
    def __init__(self, data):
        self.wealth = 1.0
        self.data = data
        self.data.bind_to(self.update_how_happy)
        self.happiness = self.wealth / self.data.global_wealth

    def update_how_happy(self, global_wealth):
        self.happiness = self.wealth / global_wealth


if __name__ == '__main__':
    data = GlobalWealth()
    p = Person(data)
    print(p.happiness)
    data.global_wealth = 1.0
    print(p.happiness)