一、组件向core注册的方法
1. core.register("core中组件的名字",组件类的实例):创建实例时参数已经传入
2. core.registerNew(组件类名,参数...):若要修改在core中组件的名字,需要在组件类定义时加一个属性_core_name = "新名字"。它只是register的一个封装。
以上两种方法注册的时候都会创建类的实例,因而会调用组件类的__init__函数。
二、定义事件
以上两种方法注册的时候都会创建类的实例,因而会调用组件类的__init__函数。
二、定义事件
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):