首页 > 代码库 > POX控制器的创建组件及事件处理

POX控制器的创建组件及事件处理

1. 创建组件

POX提供一系列API,使用户可以创建自己的组件,实现自己的功能

组件的注册

创建的组件需要注册到core中,使用core的一个主要目的就是为各个组件提供一个集结地。core是类POXcore的一个实例。

向core注册组件,有两种方法

(1)core.register()

register()方法注册一个类(组件)实例,使用两个参数,第一个参数是组件注册到core的名称,第二参数是组件实例

例子:

#!/usr/bin/pythonfrom pox.core import coreclass MyComponent(object):    def __init__(self, an_arg):        self.arg = an_arg        print "MyComponent instance registered with arg:", self.arg    def message(self):        print "MyComponent with arg:", self.argdef launch():    component = MyComponent("chosen")    core.register("square", component)    core.square.message()

 

(2)core.registerNew()

registerNew()方法注册一个类(组件),若该组件有_core_name属性,则注册到core的组件名称为_core_name的值,否则就是类名称本身

例子

#!/usr/bin/pythonfrom pox.core import coreclass MyComponent(object):    _core_name = "square"    def __init__(self, an_arg):        self.arg = an_arg        print "MyComponent instance registered with arg:", self.arg    def message(self):        print "MyComponent with arg:", self.argdef launch():    core.registerNew(MyComponent, "chosen")    core.square.message() #注意此处是用组件名称‘square’调用组件的函数

 

2. POX事件机制

POX的事件处理符合发布/订阅模式(publish/subscribe paradigm)。

某个对象publish事件(在revent术语中,称为”raising“一个事件,也叫“sourcing”,“firing”,“dispatching”事件)

另外的对象可以在这个对象上subscribe指定的事件(在revent术语中,称为“listening to”,也叫“handling”,或者“sinking”)

POX中的事件都是revent.Event的子类, raise事件的类继承自EventMixin, EventMixin中有个类级别变量_eventMixin_Events,在其中声明所需raise的事件

(1) 创建自己的事件类型,继承自Event

class RunningStarted(Event):    def __init__(self, name = "nike"):        Event.__init__(self)        self.name = name    @property    def runner_start(self):        return self.name == "nike"

(2) 创建raise事件的类,继承自EventMixin

class Game(EventMixin):    _eventMixin_events = set([        RunningStarted,    ])

(3) 创建处理事件的函数,通常带有一个参数,即event对象本身

def start_run(event):        print "it‘s time now, start running"

(4) 侦听事件(侦听事件的方法有addListener()、addListenerByName()和addListeners())

侦听事件前创建类Game的实例game 

game = Game()

侦听事件RunningStarted

game.addListener(RunningStarted, start_run)

(5) raise事件

game.raiseEvent(RunningStarted("nike")

 注意:必须先侦听事件,再raise事件

(6) 最后注册组件

def launch():    core.registerNew(Game)

 

POX控制器的创建组件及事件处理