在运行时实现观察者设计模式的对象通知工具

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...

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何在导入到Google工作表时使用ApachePOI显示系列标签   java在Swing表上修改数据生成SQL   java TCP数据包在网络级别合并   java自动连线bean在线程位置为空   javasocket。禁用无线连接时getOutputStream()阻塞   JSON上的javascript字符串数组。stringify输出unicode字符   java在Oracle数据库中存储不同类型数据的最佳体验   Spring MVC中模板引擎后的java进程输出   不知从哪里来的java空字符串。   如何加载java。使用Adobe Flex的客户端的属性文件?   java如何替换多层括号之间的所有内容?   {JSONObject必须以java'开头   java使用commandButton或commandLink返回并管理HTML控件值   java Android大文本视图动态   java JMock需要自定义类   java Android应用程序在emulator中工作,但在设备中失败   java连接到derby数据库时使用什么文件路径格式?   java在一个函数调用中返回两个结果?