How to trigger function on value change?(如何触发价值变化的功能?)
问题描述
我意识到这个问题与事件处理有关,并且我已经阅读了有关 Python 事件处理程序和调度程序的信息,所以要么它没有回答我的问题,要么我完全错过了信息.
I realise this question has to do with event-handling and i've read about Python event-handler a dispatchers, so either it did not answer my question or i completely missed out the information.
我希望在值 v 发生变化时触发对象 A 的方法 m():
I want method m() of object A to be triggered whenever value v is changing: 
例如(假设金钱使人快乐):
For instance (assuming money makes happy):
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 值.
So whenever the global_wealth value is changed, all instances of the class Person should change their happiness value accordingly.
NB:我不得不编辑这个问题,因为第一个版本似乎表明我需要 getter 和 setter 方法.很抱歉造成混乱.
NB: I had to edit the question since the first version seemed to suggest i needed getter and setter methods. Sorry for the confusion.
推荐答案
你需要使用 观察者模式.在以下代码中,一个人订阅接收来自全球财富实体的更新.当全球财富发生变化时,该实体会提醒其所有订阅者(观察者)发生变化.Person 然后更新自己.
You need to use the Observer Pattern. In the following code, a person subscribes to receive updates from the global wealth entity. When there is a change to global wealth, this entity then alerts all its subscribers (observers) that a change happened. Person then updates itself.
我在这个例子中使用了属性,但它们不是必需的.一个小警告:属性仅适用于新样式类,因此类声明后的 (object) 是强制性的.
I make use of properties in this example, but they are not necessary. A small warning: properties work only on new style classes, so the (object) after the class declarations are mandatory for this to work.
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)
                        这篇关于如何触发价值变化的功能?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何触发价值变化的功能?
				
        
 
            
        基础教程推荐
- PANDA VALUE_COUNTS包含GROUP BY之前的所有值 2022-01-01
 - Plotly:如何设置绘图图形的样式,使其不显示缺失日期的间隙? 2022-01-01
 - 无法导入 Pytorch [WinError 126] 找不到指定的模块 2022-01-01
 - 在Python中从Azure BLOB存储中读取文件 2022-01-01
 - 使用大型矩阵时禁止 Pycharm 输出中的自动换行符 2022-01-01
 - 包装空间模型 2022-01-01
 - 求两个直方图的卷积 2022-01-01
 - 修改列表中的数据帧不起作用 2022-01-01
 - PermissionError: pip 从 8.1.1 升级到 8.1.2 2022-01-01
 - 在同一图形上绘制Bokeh的烛台和音量条 2022-01-01
 
    	
    	
    	
    	
    	
    	
    	
    	
				
				
				
				