創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務器提供商,新人活動買多久送多久,劃算不套路!
小編給大家分享一下python中回調函數(shù)指的是什么意思,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
一、百度百科上對回調函數(shù)的解釋:
回調函數(shù)就是一個通過函數(shù)指針調用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù),當這個指針被用為調用它所指向的函數(shù)時,我們就說這是回調函數(shù)。回調函數(shù)不是由該函數(shù)的實現(xiàn)方直接調用,而是在特定的事件或條件發(fā)生時由另外的一方調用的,用于對該事件或條件進行響應。
二、什么是回調:
軟件模塊之間總是存在著一定的接口,從調用方式上,可以把他們分為三類:同步調用、回調和異步調用。
同步調用是一種阻塞式調用,調用方要等待對方執(zhí)行完畢才返回,它是一種單向調用;回調是一種雙向調用模式,也就是說,被調用方在接口被調用時也會調用對方的接口;異步調用是一種類似消息或事件的機制,不過它的調用方向剛好相反,接口的服務在收到某種訊息或發(fā)生某種事件時,會主動通知客戶方(即調用客戶方的接口)。回調和異步調用的關系非常緊密,通常我們使用回調來實現(xiàn)異步消息的注冊,通過異步調用來實現(xiàn)消息的通知。同步調用是三者當中最簡單的,而回調又常常是異步調用的基礎,因此,下面我們著重討論回調機制在不同軟件架構中的實現(xiàn)。
三、一個小例子:
#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$
網(wǎng)上搜到的一個面向對象實現(xiàn)的例子:
當你要加入回調(Callback)功能的時候,代碼往往會偏重于回調的實現(xiàn)而不是問題本身了。一個解決方法就是實現(xiàn)一個通用的基礎類來解決回調的需求,然后再來實現(xiàn)你為某個事件(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)和兩個處理函數(shù)(handler)。第一個處理函數(shù)handler1注冊了EVENT1,而第二個處理函數(shù)handler2當EVENT1或者EVENT2發(fā)生的時候都會執(zhí)行(即注冊了全部的事件)。
運行函數(shù)(run)在MyClass的主循環(huán)中,它會將對應的事件派送(dispatch)出去。這(這里指dispatch函數(shù))會返回一個函數(shù),我們可以把所有需要傳給這個函數(shù)的參數(shù)列表傳給它。這個函數(shù)運行結束會返回一個列表(list),列表中是所有的返回值。
也許,使用Metaclass能夠實現(xiàn)的更優(yōu)雅一些吧。
看完了這篇文章,相信你對python中回調函數(shù)指的是什么意思有了一定的了解,想了解更多相關知識,歡迎關注創(chuàng)新互聯(lián)-成都網(wǎng)站建設公司行業(yè)資訊頻道,感謝各位的閱讀!
當前名稱:python中回調函數(shù)指的是什么意思-創(chuàng)新互聯(lián)
分享鏈接:http://www.chinadenli.net/article36/ccpgpg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供標簽優(yōu)化、App開發(fā)、網(wǎng)頁設計公司、建站公司、用戶體驗、品牌網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)