POX学习笔记之组件注册与事件

2013-12-19 20:13:08
opensource
原创 2072
一、组件向core注册的方法
1. core.register("core中组件的名字",组件类的实例):创建实例时参数已经传入
2. core.registerNew(组件类名,参数...):若要修改在core中组件的名字,需要在组件类定义时加一个属性_core_name = "新名字"
二、定义事件
POX中的事件都是revent.Event类的子类的实例。
class 事件名(Event):
     类定义
三、关联事件处理函数的方法
1. 能触发事件的类的实例.addListener(事件类, 事件处理函数):事件类必须在作用域内,要不然不识别
2. 能触发事件的类的实例.addListenerByName("事件类名", 事件处理函数):事件类可以不在作用域内,仅传递一个类名字符串
3. 能触发事件的类的实例.addListeners(事件处理函数所在类的实例):以foo.addListeners(bar)为例,POX将检查foo能触发的每个事件EventName,若在bar所在类有_handle_EventName函数,则自动关联处理函数。
4. 能触发事件的类的实例.addListeners(事件处理函数所在类的实例,prefix="前缀名"):当处理函数所在类要处理来自多源的相同事件时,可以加前缀来进行区分。比如
class VeryHungryPerson (object):
  def __init__ (self):
    master_chef.addListeners(self, prefix="master")
    backup_chef.addListeners(self, prefix="secondary")
  def _handle_master_SpamFinished (self, event):
    print "Spam is ready!  Smells delicious!"
  def _handle_secondary_SpamFinished (self, event):
    print "Backup spam is ready.  Smells slightly less delicious."
5.事件监听者(一个类)的__init__函数中self.listenTo(产生事件的类)
四、触发事件
一个触发事件的类继承自revent.EventMixin,并在_eventMixin_Events中声明它触发的事件。
1. 类函数定义中调用self.raiseEvent(事件类名("参数"))或者self.raiseEvent(事件类名,"参数"),后者更好一些,因为可以在没有监听者的时候避免创建对象。
2. 能触发事件的类的实例.raiseEvent(事件类名("参数"))或者能触发事件的类的实例.(事件类名,"参数"),同理后者好一些。
五、总体架构(参考http://richardzhao.me/?p=209 链接里的GoingUpEvent事件是boot函数调用的core.goUp()函数中触发的。)
1.定义事件类:class TestEvent (Event):
2.定义触发事件的类
class TestEvent_Generator (EventMixin):
    类里会有类似self.raiseEvent(TestEvent, stuff)的语句。
3.定义监听并处理事件的类:
class TestEvent_Listener (EventMixin):
    类里会有self.listenTo(core.TestEvent_Generator)
   会有_handle_TestEvent (self, event):

发表评论
评论通过审核后显示。