gpt4 book ai didi

python - 如何触发值(value)变化的功能?

转载 作者:IT老高 更新时间:2023-10-28 20:35:03 26 4
gpt4 key购买 nike

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

我希望在值 v 发生变化时触发对象 A 的方法 m():

例如(假设金钱使人快乐):

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 值。

NB:我不得不编辑这个问题,因为第一个版本似乎表明我需要 getter 和 setter 方法。很抱歉造成困惑。

最佳答案

您需要使用 Observer Pattern .在以下代码中,一个人订阅接收来自全局财富实体的更新。当全局财富发生变化时,该实体会提醒其所有订阅者(观察者)发生变化。 Person 然后更新自己。

我在这个例子中使用了属性,但它们不是必需的。一个小警告:属性仅适用于新样式类,因此类声明后的 (object) 是强制性的。

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)

关于python - 如何触发值(value)变化的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6190468/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com