Reputation: 3140
As far as I know, this is like an Observer pattern. Scenario: A Center object keeps a list (queue) of all its clients. I'm using Twisted.
following code is just for demo only:
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()
Upvotes: 6
Views: 4702
Reputation: 48067
Whenever a property of class is changed, setattr()
function is called. You can override this by defining __setattr__(self, property, value)
function in your class.
You need to make your required function call within this __ setattr__()
. Below is the sample example based on your requirement:
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
Whenever you will attempt to change the value of any of class's property, this __settattr__
function will be called.
Upvotes: 6
Reputation: 531055
Make va
a property.
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()
Upvotes: 10