Python回呼函數用法執行個體詳解

來源:互聯網
上載者:User
本文執行個體講述了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程式設計有所協助。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.