Python回調函數用法實例詳解


本文實例講述了Python回調函數用法。分享給大家供大家參考。具體分析如下:

一、百度百科上對回調函數的解釋:

回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用為調用它所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。

二、什么是回調:

軟件模塊之間總是存在着一定的接口,從調用方式上,可以把他們分為三類:同步調用、回調和異步調用。同步調用是一種阻塞式調用,調用方要等待對方執行完畢才返回,它是一種單向調用;回調是一種雙向調用模式,也就是說,被調用方在接口被調用時也會調用對方的接口;異步調用是一種類似消息或事件的機制,不過它的調用方向剛好相反,接口的服務在收到某種訊息或發生某種事件時,會主動通知客戶方(即調用客戶方的接口)。回調和異步調用的關系非常緊密,通常我們使用回調來實現異步消息的注冊,通過異步調用來實現消息的通知。同步調用是三者當中最簡單的,而回調又常常是異步調用的基礎,因此,下面我們着重討論回調機制在不同軟件架構中的實現。

三、一個小例子:

網上搜到的一個面向對象實現的例子:

當你要加入回調(Callback)功能的時候,代碼往往會偏重於回調的實現而不是問題本身了。一個解決方法就是實現一個通用的基礎類來解決回調的需求,然后再來實現你為某個事件(Event)所綁定(Binding)的方法(Method)。

代碼如下:

 1 class CallbackBase: 
 2     def __init__(self): 
 3         self.__callbackMap = {} 
 4         for k in (getattr(self, x) for x in dir(self)): 
 5             if hasattr(k, "bind_to_event"): 
 6                 self.__callbackMap.setdefault(k.bind_to_event, []).append(k) 
 7             elif hasattr(k, "bind_to_event_list"): 
 8                 for j in k.bind_to_event_list: 
 9                     self.__callbackMap.setdefault(j, []).append(k) 
10     ## staticmethod is only used to create a namespace 
11     @staticmethod
12     def callback(event): 
13         def f(g, ev = event): 
14             g.bind_to_event = ev 
15             return g 
16         return f 
17     @staticmethod
18     def callbacklist(eventlist): 
19         def f(g, evl = eventlist): 
20             g.bind_to_event_list = evl 
21             return g 
22         return f 
23     def dispatch(self, event): 
24         l = self.__callbackMap[event] 
25         f = lambda *args, **kargs: map(lambda x: x(*args, **kargs), l) 
26         return f 
27 
28 ## Sample 
29 class MyClass(CallbackBase): 
30     EVENT1 = 1
31     EVENT2 = 2
32     
33     @CallbackBase.callback(EVENT1) 
34     def handler1(self, param = None): 
35         print "handler1 with param: %s" % str(param) 
36         return None
37 
38     @CallbackBase.callbacklist([EVENT1, EVENT2]) 
39     def handler2(self, param = None): 
40         print "handler2 with param: %s" % str(param) 
41         return None
42 
43     def run(self, event, param = None): 
44         self.dispatch(event)(param)
45         
46 if __name__ == "__main__": 
47     a = MyClass() 
48     a.run(MyClass.EVENT1, 'mandarina') 
49     a.run(MyClass.EVENT2, 'naranja') 

這里有一個類,它有兩個事件(EVENT1和EVENT2)和兩個處理函數(handler)。第一個處理函數handler1注冊了EVENT1,而第二個處理函數handler2當EVENT1或者EVENT2發生的時候都會執行(即注冊了全部的事件)。

運行函數(run)在MyClass的主循環中,它會將對應的事件派送(dispatch)出去。這(這里指dispatch函數)會返回一個函數,我們可以把所有需要傳給這個函數的參數列表傳給它。這個函數運行結束會返回一個列表(list),列表中是所有的返回值。

也許,使用Metaclass能夠實現的更優雅一些吧。

希望本文所述對大家的Python程序設計有所幫助。

 

轉載地址:http://www.jb51.net/article/68797.htm

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM