库实现中介模式以使代码可扩展
mediator的Python项目详细描述
库实现中介模式以使代码可扩展。
灵感来自symfony/event-dispatcher组件。
安装
使用pip:
# pip install mediator
手动:
$ git clone https://github.com/Kilte/mediator $ cd mediator # python setup.py install
用法
frommediatorimportMediatorm=Mediator()
定义事件
frommediatorimportEventclassEventOne(Event):passclassEventTwo(Event):event_name='event_two'
添加侦听器
defevent_listener(event):print('Got event: %r'%event)m.add_listener(EventOne,event_listener)# or m.add_listener('EventOne', event_listener)m.add_listener('event_two',event_listener)# or m.add_listener(EventTwo, event_listener)
触发事件
event1=EventOne()event2=EventTwo()m.dispatch(event1)# Got event: <EventOne object at 0x7f954bc2b250>m.dispatch(event2)# Got event: <EventTwo object at 0x7f954bbbd510>
删除侦听器
defanother_listener(event):print('Got another event: %r'%event)m.add_listener(EventOne,another_listener)m.remove_listener('EventOne',event_listener)m.dispatch(event1)# Got another event: <EventOne object at 0x7f954bc2b250>
删除所有侦听器
m.remove_listener('EventOne')m.dispatch(event1)# Nothing was happened
使用优先级
m.add_listener('EventOne',another_listener,-255)m.add_listener('EventOne',event_listener,255)m.dispatch(event1)# Got another event: <EventOne object at 0x7f954bc2b250># Got event: <EventOne object at 0x7f954bc2b250>
使用订户
frommediatorimportSubscriberInterfaceclassSubscriber(SubscriberInterface):deffirst(self,event):event.first=Truedefmiddle(self,event):event.middle=Truedeflast(self,event):event.last=Truedefevent2_handler(self,event):event.success=Truedefevent3_handler(self,event):event.success=Truedefget_subscribed_events(self):return{'event1':[['middle'],['first',-100],['last',100]],'event2':'event2_handler','event3':['event3_handler']}classEvent1(Event):event_name='event1'def__init__(self):self.first=Falseself.middle=Falseself.last=FalseclassEvent2(Event):event_name='event2'def__init__(self):self.success=TrueclassEvent3(Event2):event_name='event3'subscriber=Subscriber()event1=Event1()event2=Event2()event3=Event3()m.add_subscriber(subscriber)m.dispatch(event1)print('%s;%s;%s'%(event1.first,event1.middle,event1.last))# True;True;Truem.dispatch(event2)print(event2.success)# Truem.dispatch(event3)print(event3.success)# True
使用decorator添加侦听器
importsysimportvenusianfrommediatorimportVENUSIAN_CATEGORY@SomeEvent.listen(priority=255,instance='mediator',category=VENUSIAN_CATEGORY)# All args are optionaldefsome_event_listener(event):event.attr='value'scanner=venusian.Scanner(mediator=mediator)scanner.scan(package=sys.modules[__name__],categories=[VENUSIAN_CATEGORY])m.dispatch(SomeEvent())
有关详细信息,请参见源代码和测试。
更改日志
0.4.0(2017年3月17日)
- 修复了多重继承支持
- 改进的金星支持
0.3.0(2016年2月25日)
- Mediator.__init__和Mediator.scan现在只接受关键字参数。
- 已删除Mediator.set_scanner方法。
- Mediator.dispatch()现在只接受事件实例。
- Mediator.add_listener和Mediator.remove_listener接受Event或str的子类。
- Event.get_name()和Event.set_name()被删除,取而代之的是Event.get_event_name()和Event.event_name类属性。
- 现在不需要在自己的事件中调用super().__init__()。
0.2.1(2015年12月18日)
- 添加了Mediator.set_scanner方法以允许使用自定义扫描程序实例。
0.2.0(2015年12月17日)
- 基于类名的自动事件名称检测。
- 添加了%Event%.listendecorator。
0.1.0(2015年11月19日)
- 第一次释放。
贡献
- 分叉并克隆它
- 创建您的功能分支(git checkout-b awesome feature)
- 进行更改
- 如有必要,编写/更新测试(进行构建和测试)
- 必要时更新readme.md
- 推动您的分支(Git Push Origin Awesome功能)
- 发送拉取请求
许可证
麻省理工学院许可证(MIT)