python中的回撥函式
#######百度百科上對回撥函式的解釋#######
回撥函式就是一個通過函式指標呼叫的函式。如果你把函式的指標(地址)作為引數傳遞給另一個函式,當這個指標被用為呼叫它所指向的函式時,我們就說這是回撥函式。回撥函式不是由該函式的實現方直接呼叫,而是在特定的事件或條件發生時由另外的一方呼叫的,用於對該事件或條件進行響應。
##########什麼是回撥##########
軟體模組之間總是存在著一定的介面,從呼叫方式上,可以把他們分為三類:同步呼叫、回撥和非同步呼叫。同步呼叫是一種阻塞式呼叫,呼叫方要等待對方執行完畢才返回,它是一種單向呼叫;回撥是一種雙向呼叫模式,也就是說,被呼叫方在介面被呼叫時也會呼叫對方的介面;非同步呼叫是一種類似訊息或事件的機制,不過它的呼叫方向剛好相反,介面的服務在收到某種訊息或發生某種事件時,會主動通知客戶方(即呼叫客戶方的介面)。回撥和非同步呼叫的關係非常緊密,通常我們使用回撥來實現非同步訊息的註冊,通過非同步呼叫來實現訊息的通知。同步呼叫是三者當中最簡單的,而回撥又常常是非同步呼叫的基礎,因此,下面我們著重討論回撥機制在不同軟體架構中的實現。
#######一個小例子#######
- #call.py
- import called
- def callback():
- print "in callback"
- def main():
- #called.test()
- called.test_call(callback)
- print "in call.py"
- main()
- #called.py
- '''''
- def test():
- print "in called.py test()"
- '''
- def test_call(p_call):
- print "in called.py test_call()"
- p_call()
- joe@joe:~/test/python$ python call.py
- in called.py test_call()
- in callback
- in call.py
- joe@joe:~/test/python$
#########網上搜到的一個物件導向實現的例子##########
當你要加入回撥(Callback)功能的時候,程式碼往往會偏重於回撥的實現而不是問題本身了。一個解決方法就是實現一個通用的基礎類來解決回撥的需求,然後再來實現你為某個事件(Event)所繫結(Binding)的方法(Method)。
程式碼如下:
- class CallbackBase:
- def __init__(self):
- self.__callbackMap = {}
- for k in (getattr(self, x) for x in dir(self)):
- if hasattr(k, "bind_to_event"):
- self.__callbackMap.setdefault(k.bind_to_event, []).append(k)
- elif hasattr(k, "bind_to_event_list"):
- for j in k.bind_to_event_list:
- self.__callbackMap.setdefault(j, []).append(k)
- ## staticmethod is only used to create a namespace
- @staticmethod
- def callback(event):
- def f(g, ev = event):
- g.bind_to_event = ev
- return g
- return f
- @staticmethod
- def callbacklist(eventlist):
- def f(g, evl = eventlist):
- g.bind_to_event_list = evl
- return g
- return f
- def dispatch(self, event):
- l = self.__callbackMap[event]
- f = lambda *args, **kargs: \
- map(lambda x: x(*args, **kargs), l)
- return f
- ## Sample
- class MyClass(CallbackBase):
- EVENT1 = 1
- EVENT2 = 2
- @CallbackBase.callback(EVENT1)
- def handler1(self, param = None):
- print "handler1 with param: %s" % str(param)
- return None
- @CallbackBase.callbacklist([EVENT1, EVENT2])
- def handler2(self, param = None):
- print "handler2 with param: %s" % str(param)
- return None
- def run(self, event, param = None):
- self.dispatch(event)(param)
- if __name__ == "__main__":
- a = MyClass()
- a.run(MyClass.EVENT1, 'mandarina')
- a.run(MyClass.EVENT2, 'naranja')
這裡有一個類,它有兩個事件(EVENT1和EVENT2)和兩個處理函式(handler)。第一個處理函式handler1註冊了EVENT1,而第二個處理函式handler2當EVENT1或者EVENT2發生的時候都會執行(即註冊了全部的事件)。
執行函式(run)在MyClass的主迴圈中,它會將對應的事件派送(dispatch)出去。這(這裡指dispatch函式)會返回一個函式,我們可以把所有需要傳給這個函式的引數列表傳給它。這個函式執行結束會返回一個列表(list),列表中是所有的返回值。
也許,使用Metaclass能夠實現的更優雅一些吧。
相關文章
- Python回撥函式Python函式
- js中的回撥函式JS函式
- 對於Python中回撥函式的理解Python函式
- Python/OpenCV:回撥函式PythonOpenCV函式
- js 中的submit 回撥函式JSMIT函式
- C++中的回撥函式C++函式
- 回撥函式函式
- 回撥函式的作用函式
- delphi中回撥函式差異函式
- JavaScript 回撥函式JavaScript函式
- JavaScript回撥函式JavaScript函式
- JS—回撥函式JS函式
- 動畫回撥函式動畫函式
- java回撥函式Java函式
- 回撥函式(CallBack)函式
- 關於 js 中的回撥函式 callbackJS函式
- 理解javascript中的回撥函式(callback)【轉】JavaScript函式
- 聊一聊Vue中的回撥函式Vue函式
- [JS]回撥函式和回撥地獄JS函式
- 回撥函式,求積函式函式
- 深究Python中的asyncio庫-函式的回撥與排程Python函式
- 回撥函式的理解(一)函式
- Java回撥函式的理解Java函式
- Python技法3:匿名函式、回撥函式和高階函式Python函式
- 回撥函式 與 函式閉包函式
- 函式指標&回撥函式Callback函式指標
- TLS回撥函式(Note)TLS函式
- java 回撥函式示例Java函式
- android回撥函式Android函式
- 函式回撥(C++)函式C++
- 類中靜態回撥函式應用函式
- JS閉包函式和回撥函式JS函式
- jquery回撥函式中this的指向簡單介紹jQuery函式
- C++回撥函式 用法C++函式
- java回撥函式機制Java函式
- JS之回撥函式(callback)JS函式
- js函式回撥錯誤JS函式
- c++回撥函式(下)C++函式