Python回調(diào)函數(shù)用法實(shí)例詳解
本文實(shí)例講述了Python回調(diào)函數(shù)用法。分享給大家供大家參考。具體分析如下:
一、百度百科上對(duì)回調(diào)函數(shù)的解釋:
回調(diào)函數(shù)就是一個(gè)通過(guò)函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用為調(diào)用它所指向的函數(shù)時(shí),我們就說(shuō)這是回調(diào)函數(shù)。回調(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時(shí)由另外的一方調(diào)用的,用于對(duì)該事件或條件進(jìn)行響應(yīng)。
二、什么是回調(diào):
軟件模塊之間總是存在著一定的接口,從調(diào)用方式上,可以把他們分為三類:同步調(diào)用、回調(diào)和異步調(diào)用。同步調(diào)用是一種阻塞式調(diào)用,調(diào)用方要等待對(duì)方執(zhí)行完畢才返回,它是一種單向調(diào)用;回調(diào)是一種雙向調(diào)用模式,也就是說(shuō),被調(diào)用方在接口被調(diào)用時(shí)也會(huì)調(diào)用對(duì)方的接口;異步調(diào)用是一種類似消息或事件的機(jī)制,不過(guò)它的調(diào)用方向剛好相反,接口的服務(wù)在收到某種訊息或發(fā)生某種事件時(shí),會(huì)主動(dòng)通知客戶方(即調(diào)用客戶方的接口)?;卣{(diào)和異步調(diào)用的關(guān)系非常緊密,通常我們使用回調(diào)來(lái)實(shí)現(xiàn)異步消息的注冊(cè),通過(guò)異步調(diào)用來(lái)實(shí)現(xiàn)消息的通知。同步調(diào)用是三者當(dāng)中最簡(jiǎn)單的,而回調(diào)又常常是異步調(diào)用的基礎(chǔ),因此,下面我們著重討論回調(diào)機(jī)制在不同軟件架構(gòu)中的實(shí)現(xiàn)。
三、一個(gè)小例子:
#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)上搜到的一個(gè)面向?qū)ο髮?shí)現(xiàn)的例子:
當(dāng)你要加入回調(diào)(Callback)功能的時(shí)候,代碼往往會(huì)偏重于回調(diào)的實(shí)現(xiàn)而不是問(wèn)題本身了。一個(gè)解決方法就是實(shí)現(xiàn)一個(gè)通用的基礎(chǔ)類來(lái)解決回調(diào)的需求,然后再來(lái)實(shí)現(xiàn)你為某個(gè)事件(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')
這里有一個(gè)類,它有兩個(gè)事件(EVENT1和EVENT2)和兩個(gè)處理函數(shù)(handler)。第一個(gè)處理函數(shù)handler1注冊(cè)了EVENT1,而第二個(gè)處理函數(shù)handler2當(dāng)EVENT1或者EVENT2發(fā)生的時(shí)候都會(huì)執(zhí)行(即注冊(cè)了全部的事件)。
運(yùn)行函數(shù)(run)在MyClass的主循環(huán)中,它會(huì)將對(duì)應(yīng)的事件派送(dispatch)出去。這(這里指dispatch函數(shù))會(huì)返回一個(gè)函數(shù),我們可以把所有需要傳給這個(gè)函數(shù)的參數(shù)列表傳給它。這個(gè)函數(shù)運(yùn)行結(jié)束會(huì)返回一個(gè)列表(list),列表中是所有的返回值。
也許,使用Metaclass能夠?qū)崿F(xiàn)的更優(yōu)雅一些吧。
希望本文所述對(duì)大家的Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Xadmin+rules實(shí)現(xiàn)多選行權(quán)限方式(級(jí)聯(lián)效果)
這篇文章主要介紹了Xadmin+rules實(shí)現(xiàn)多選行權(quán)限方式(級(jí)聯(lián)效果),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
編程小妙招:Python帶你玩轉(zhuǎn)Excel超鏈接
掌握Python實(shí)現(xiàn)Excel加超鏈接的技巧,讓你的數(shù)據(jù)報(bào)告活起來(lái),本指南將帶你輕松穿梭于單元格間,一行代碼搞定鏈接,別等了,跟我一起讓你的Excel工作表不僅聰明,還能“點(diǎn)”亮你的信息網(wǎng)絡(luò)!2023-12-12
python進(jìn)度條顯示-tqmd模塊的實(shí)現(xiàn)示例
這篇文章主要介紹了python進(jìn)度條顯示-tqmd模塊的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Flask 入門(mén)Web 微框架Hello Flask
這篇文章主要介紹了 Flask 入門(mén)Web 微框架Hello Flask,F(xiàn)lask 是一個(gè) Python 實(shí)現(xiàn)的 Web 微框架,之所以稱之為微框架,是因?yàn)?nbsp;Flask 核心簡(jiǎn)單且易于擴(kuò)展,有兩個(gè)主要依賴,WSGI工具集:Werkzeug和模板引擎:Jinja2,Flask 只保留了 Web 開(kāi)發(fā)的核心功能,需要的朋友可以參考一下2021-11-11
Python判斷兩個(gè)文件是否相同與兩個(gè)文本進(jìn)行相同項(xiàng)篩選的方法
今天小編就為大家分享一篇關(guān)于Python判斷兩個(gè)文件是否相同與兩個(gè)文本進(jìn)行相同項(xiàng)篩選的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03
Go語(yǔ)言基于Socket編寫(xiě)服務(wù)器端與客戶端通信的實(shí)例
這篇文章主要介紹了Go語(yǔ)言基于Socket編寫(xiě)服務(wù)器端與客戶端通信的實(shí)例,包括實(shí)現(xiàn)基于自定義通訊協(xié)議的Socket通信,需要的朋友可以參考下2016-02-02

