zoukankan      html  css  js  c++  java
  • POX控制器的创建组件及事件处理

    1. 创建组件

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

    组件的注册

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

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

    (1)core.register()

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

    例子:

    #!/usr/bin/python
    from pox.core import core
    
    
    class 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.arg
    
    
    def launch():
        component = MyComponent("chosen")
        core.register("square", component)
        core.square.message()

    (2)core.registerNew()

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

    例子

    #!/usr/bin/python
    
    from pox.core import core
    
    
    class 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.arg
    
    
    def 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)

     整个代码实现

    from pox.lib.revent.revent import EventMixin, Event
    from pox.core import core
    
    # creating your owen Event Types
    class RunningStarted(Event):
        def __init__(self, name = "nike"):
            Event.__init__(self)
            self.name = name
    
        @property
        def runner_start(self):
            return self.name == "nike"
    
    class RunningFinished(Event):
        def __init__(self, name = "nike"):
            Event.__init__(self)
            self.name = name
    
    
    class Game(EventMixin):
        _eventMixin_events = set([
            RunningStarted,
            RunningFinished,
        ])
    
    
    class Runner(object):
        def __init__(self):
            game.addListeners(self)
        def _handle_RunningStarted(self, event):
            print "run now"
        def _handle_RunningFinished(self, event):
            print "stop run"
    
    game = Game()
    
    
    def launch():
        core.registerNew(Game)
        core.registerNew(Runner)
        game.raiseEvent(RunningStarted("nike"))
        game.raiseEvent(RunningFinished("nike"))
    

      

  • 相关阅读:
    6.4 总结(关于正确率)
    POI2013 Bytecomputer
    BZOJ1485 有趣的数列
    PAM
    BZOJ1787 meet
    BZOJ3895 rock
    URAL 1996 Cipher Message 3
    BZOJ1468 Tree
    Javascript初识之数据类型
    Javascript初识之流程控制、函数和内置对象
  • 原文地址:https://www.cnblogs.com/zflibra/p/4051015.html
Copyright © 2011-2022 走看看