2013-04-12 100 views
3

我是python的新手,在構建真正的應用程序時,我正在探索通過語言的方式。現在,我試圖建立一個基於事件的應用程序,並想使用的裝飾,以此來增加功能爲聽衆:裝修這可能嗎?

@onEvent(eventSpecificArgument) 
def foo(): 
    print('foo') 

在上面的例子中,我添加函數foo作爲一名聽衆爲事件,並且已經傳遞了將由裝飾器使用的參數。

這是一個可能(而且足夠聰明)的解決方案,我想要什麼?如果是這樣,我該怎麼實現呢?

+2

你喜歡元編程?我喜歡這個演講:http://www.youtube.com/watch?v=sPiWg5jSoZI –

+0

不僅可能並且完全合理,取決於您使用的GUI或網絡或其他基於事件的框架,它可能已經存在(或者足夠接近你的可以建立這種平凡的可能已經存在)。 – abarnert

回答

4

當然,修飾者只是可以調用。裝飾符號只是語法糖,你的榜樣轉化爲:

def foo(): 
    print('foo') 
foo = onEvent(eventSpecificArgument)(foo) 

所以你onEvent()調用需要返回的東西,可以被調用;那個'東西'將通過foo

無論你在onEvent中做什麼,在什麼情況下它都返回給你。

像下面將工作:

registry = {} 

def onEvent(eventname): 
    def eventdecorator(func): 
     registry.setdefault(eventname, []).append(func) 
     return func 
    return eventdecorator 

這只是增加了func到註冊表對於給定的事件名稱和返回功能不變。

後來,當你再需要處理的情況下,你只是仰望的事件處理程序與事件:

for func in registry.get(eventname,()): 
    func() 
+0

謝謝,這看起來不錯。 –

+0

可能希望在'eventdecorator'周圍添加'functools.wraps',並使用'defaultdict'而不是'dict.setdefault'。 –

+0

我沒有在這裏包裝功能;所以'functools.wraps'沒有任何意義。 –