Ben*_*min 48 python event-handling observer-pattern
我意识到这个问题与事件处理有关,我已经阅读了关于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
Run Code Online (Sandbox Code Playgroud)
因此,每当global_wealth
更改值时,类的所有实例Person
都应相应地更改其happiness
值.
注意:我必须编辑问题,因为第一个版本似乎暗示我需要getter和setter方法.对困惑感到抱歉.
Thi*_*ves 76
您需要使用观察者模式.在以下代码中,一个人订阅接收来自全球财富实体的更新.当全球财富发生变化时,该实体会向其所有订户(观察员)发出变更警报.然后人自我更新.
我在这个例子中使用了属性,但它们不是必需的.一个小警告:属性仅适用于新样式类,因此类声明之后的(对象)是必须的.
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)
Run Code Online (Sandbox Code Playgroud)
Ros*_*ron 14
如果要在更改属性时执行代码,则可以使用属性.请注意,更改属性时出现的重大副作用或显着开销对于使用您的API的人来说有点令人惊讶,因此在某些情况下您可能希望通过使用方法来避免它.
class A(object):
def m(self, p_value):
print p_value
@property
def p(self):
return self._p
@p.setter
def p(self, value)
self._p = value
self.m(value)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
56700 次 |
最近记录: |