1 class CallbackProperty(object):
2 """A property that will alert observers when upon updates"""
3
4 def __init__(self, default=None):
5 self.data = dict()
6 self.default = default
7 self.callbacks = dict()
8
9 def __get__(self, instance, owner):
10 if instance is None:
11 return self
12 return self.data.get(instance, self.default)
13
14 def __set__(self, instance, value):
15 for callback in self.callbacks.get(instance, []):
16 # alert callback function of new value
17 callback(value)
18 self.data[instance] = value
19
20 def add_callback(self, instance, callback):
21 """Add a new function to call everytime the descriptor within instance updates"""
22 if instance not in self.callbacks:
23 self.callbacks[instance] = [] # 如果是列表,可以进行添加和迭代操作
24 self.callbacks[instance].append(callback) # 这里的callback存储的是函数
25
26 class BankAccount(object):
27 balance = CallbackProperty(0)
28
29 def low_balance_warning(value):
30 if value < 100:
31 print("You are now poor")
32
33 ba = BankAccount()
34 BankAccount.balance.add_callback(ba, low_balance_warning)
35
36 ba.balance = 5000
37 print("Balance is %s" % ba.balance)
38 ba.balance = 99