在运行时实现观察者设计模式的对象通知工具
notifyr的Python项目详细描述
notifyr-在运行时创建观察者
PYPI:https://pypi.org/project/notifyr/
说明
notifyr是一个在运行时启用简单类观察者模式的包。不用构建整个观察和通知工具链,只需使用python装饰器,notifyr将处理其余部分。
受observer设计模式的启发,notifyr在不继承的情况下向类中添加了必要的方法。
装饰工
函数装饰符:
@target
- 指示修饰的函数是目标函数,并将在每次运行时触发观察者
update()
。
- 指示修饰的函数是目标函数,并将在每次运行时触发观察者
类装饰符:
@observed
- 添加
.observers
列表属性。 - 添加
.attach(obj)
方法,将obj
附加到观察者列表。 - 添加
.notify()
方法,该方法在每次调用目标函数时通知观察者
- 添加
@observer('function_name')
- 添加
update()
方法,该方法执行类的function_name()
传递,作为参数,self
和目标函数接收的所有内容(包括self
参数)。
- 添加
用法
原始代码:
classDog(object):def__init__(self,name):self.name=namedefbark(self):print('Woof')defsleep(self):print(self.name,'is now asleep: ZZzzzzZzzZ...')classPerson(object):def__init__(self,name):self.name=namedefeducate_dog(self,dog):print(self.name+':','Sleep,',dog.name)dog.sleep()
假设我们想让一个人每次狗叫时都教育它:
fromnotifyr.agentsimportobserved,observerfromnotifyr.functionsimporttarget@observedclassDog(object):def__init__(self,name):self.name=name@targetdefbark(self):print('Woof')defsleep(self):print(self.name,'is now asleep: ZZzzzzZzzZ...')@observer('educate_dog')classPerson(object):def__init__(self,name):self.name=namedefeducate_dog(self,dog):print(self.name+':','Sleep,',dog.name)dog.sleep()
现在,在把一个人绑在狗身上之后,可以通过神奇地调用bark()
来解决这个问题:
d=Dog('Tobby')p=Person('Victor')d.attach(p)# Victor is now observing Tobbyd.bark()# Woof# Victor: Sleep, Tobby# Tobby is now asleep: ZZzzzzZzzZ...