2016年1月24日 星期日

[POX] 自定義事件 / Creating and Raising Custom Events

本篇是筆記如何使用 POX自行定義事件



POX事件機制主要分成幾個部分
產生事件(Creat Event)
發布事件(Raising Event)
聆聽事件(Listening to Event)
處理事件(Handling Event)
Listen跟Handling通常是在一起的,聽完就直接動作

事件一定要有對應的處理機制
請不要肇事逃逸

必要匯入
from pox.lib.revent.revent import EventMixin, Event


建立事件 / Creating your Event Type (inherit from Event)

class GameStarted(Event):
    def __init__(self, name):
        Event.__init__(self)
        self.name = name

    @property
    def player_ready(self):
        return self.name == "Baseball"


建立發起事件 / Creating Raising Event (inherit from EventMixin)

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


建立處理事件的函數 / Creating Handling Event Function

def start_game(event):
        print "The Game is Started"

建立聆聽及處理事件的類別 / Creating Listening to / Handling Event Class

class GameHandleClass(object):
    def __init__(self):
        game.addListeners(self) #for listen the event 
    def _handle_GameStarted(self, event):
        print "Game start"

最後當你要發起事件時,需要以下指令 / If you want to raise the event
game = Game()
game.raiseEvent(GameStarted("BaseBall"))

記得要註冊 / Don't forget register you class
core.registerNew(Game)
core.registerNew(GameHandleClass)

完整程式碼 / Code

#coding=utf-8
from pox.lib.revent.revent import EventMixin, Event
from pox.core import core
 
class GameStart(Event):
    def __init__(self, name):
        Event.__init__(self)
        self.name = name
 
    @property
    def player_ready(self):
        return self.name == "BaseBall"
 
class GameOver(Event):
    def __init__(self, name):
        Event.__init__(self)
        self.name = name
 
 
class Game(EventMixin):
    _eventMixin_events = set([
        GameStart,
        GameOver,
    ])
 
 
class GameHandleClass(object):
    def __init__(self):
        game.addListeners(self)
    def _handle_GameStart(self, event):
        print "The Game is already Start"
    def _handle_GameOver(self, event):
        print "It's Game Over"
 
game = Game()
 
 
def launch():
    core.registerNew(Game)
    core.registerNew(GameHandleClass)
    game.raiseEvent(GameStart("BaseBall"))
    game.raiseEvent(GameOver("BaseBall"))



Reference [1] http://www.cnblogs.com/zflibra/p/4051015.html (Available: 2016/01/24)

沒有留言:

張貼留言