据我所知,这就像一个观察者模式。场景:一个Center对象保留其所有客户端的列表(队列)。我正在使用Twisted。
以下代码仅用于演示:
class client():
def change(self):
self.center.va = 1
def inqueue(self):
self.center.queue.enqueue(self)
def function(self):
pass
class center():
def __init__(self):
self.queue = None
self.va = 0
#### When the self.va changes, this func will be invoked
def whenChanged(self):
next = self.queue.dequeue()
next.function()
Run Code Online (Sandbox Code Playgroud)
做va一个财产。
class Center():
def __init__(self):
self.queue = None
self._va = 0
@property
def va(self):
return self._va
@va.setter
def va(self, value):
self._va = value
self.whenChanged()
def whenChanged(self):
next = self.queue.dequeue()
next.function()
Run Code Online (Sandbox Code Playgroud)
每当类的属性发生更改时,setattr()都会调用函数。您可以通过__setattr__(self, property, value)在类中定义函数来覆盖它。
您需要在 this 中进行所需的函数调用__ setattr__()。以下是基于您的要求的示例示例:
class Centre(object):
def __init__(self):
self.queue = None
self.va = 0
def whenChanged(self):
next = self.queue.dequeue()
next.function()
def __setattr__(self, key, value):
self.key = value
self.whenChanged() # <-- Your function
Run Code Online (Sandbox Code Playgroud)
每当您尝试更改任何类属性的值时,__settattr__都会调用此函数。