库实现中介模式以使代码可扩展

mediator的Python项目详细描述


库实现中介模式以使代码可扩展。

灵感来自symfony/event-dispatcher组件。

https://img.shields.io/travis/Kilte/mediator.svg?style=flat-square

安装

使用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_listenerMediator.remove_listener接受Eventstr的子类。
  • 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)

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

推荐PyPI第三方库


热门话题
java将特定于语言环境的字符串转换为BigDecimal的最佳方法   java生成的数字在下降的水平上增加   java如何验证列表中的元素是否按字母顺序排序   java无法使用Jintellitype包com。梅洛器皿   java Hibernate显示来自JComboBox的记录   java更改模拟器屏幕分辨率?   java如何从可移动/辅助SD卡中删除文件   java检查在MySQL中插入时数据库中是否存在给定的用户名   java如何替换线程。无限循环中的sleep()?   java如何从数据库中获取一列的字符串数据作为数组数据   将内容存储在缓冲区中的java   java ControllerAdvice不处理引发的异常   Java Maven问题   java NullPointerException试图从方法返回2D对象数组时   这个简单的Java代码有什么问题?   java如何删除或访问pom文件中插件的构建时间戳   java销售收据,多选(if/else),while循环,客户更改选择的能力   Java:基于字符串的加载类方法   java OrientDB服务器部分忽略OrientDB_HOME