最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python回調(diào)函數(shù)用法實(shí)例詳解

 更新時間:2015年07月02日 11:04:27   作者:tianmo2010  
這篇文章主要介紹了Python回調(diào)函數(shù)用法,以實(shí)例形式較為詳細(xì)的分析了Python回調(diào)函數(shù)的定義、功能及相關(guān)使用技巧,需要的朋友可以參考下

本文實(shí)例講述了Python回調(diào)函數(shù)用法。分享給大家供大家參考。具體分析如下:

一、百度百科上對回調(diào)函數(shù)的解釋:

回調(diào)函數(shù)就是一個通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù),當(dāng)這個指針被用為調(diào)用它所指向的函數(shù)時,我們就說這是回調(diào)函數(shù)?;卣{(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時由另外的一方調(diào)用的,用于對該事件或條件進(jìn)行響應(yīng)。

二、什么是回調(diào):

軟件模塊之間總是存在著一定的接口,從調(diào)用方式上,可以把他們分為三類:同步調(diào)用、回調(diào)和異步調(diào)用。同步調(diào)用是一種阻塞式調(diào)用,調(diào)用方要等待對方執(zhí)行完畢才返回,它是一種單向調(diào)用;回調(diào)是一種雙向調(diào)用模式,也就是說,被調(diào)用方在接口被調(diào)用時也會調(diào)用對方的接口;異步調(diào)用是一種類似消息或事件的機(jī)制,不過它的調(diào)用方向剛好相反,接口的服務(wù)在收到某種訊息或發(fā)生某種事件時,會主動通知客戶方(即調(diào)用客戶方的接口)。回調(diào)和異步調(diào)用的關(guān)系非常緊密,通常我們使用回調(diào)來實(shí)現(xiàn)異步消息的注冊,通過異步調(diào)用來實(shí)現(xiàn)消息的通知。同步調(diào)用是三者當(dāng)中最簡單的,而回調(diào)又常常是異步調(diào)用的基礎(chǔ),因此,下面我們著重討論回調(diào)機(jī)制在不同軟件架構(gòu)中的實(shí)現(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)上搜到的一個面向?qū)ο髮?shí)現(xiàn)的例子:

當(dāng)你要加入回調(diào)(Callback)功能的時候,代碼往往會偏重于回調(diào)的實(shí)現(xiàn)而不是問題本身了。一個解決方法就是實(shí)現(xiàn)一個通用的基礎(chǔ)類來解決回調(diào)的需求,然后再來實(shí)現(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當(dāng)EVENT1或者EVENT2發(fā)生的時候都會執(zhí)行(即注冊了全部的事件)。

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

也許,使用Metaclass能夠?qū)崿F(xiàn)的更優(yōu)雅一些吧。

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

相關(guān)文章

  • 超詳細(xì)Python文件操作命令知識

    超詳細(xì)Python文件操作命令知識

    最近在寫的程序頻繁地與文件操作打交道,所以想著給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于Python文件操作命令的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • Python中Tkinter組件Listbox的具體使用

    Python中Tkinter組件Listbox的具體使用

    本文主要介紹了Python中Tkinter組件Listbox的具體使用,Listbox組件用于顯示一個選擇列表,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Xadmin+rules實(shí)現(xiàn)多選行權(quán)限方式(級聯(lián)效果)

    Xadmin+rules實(shí)現(xiàn)多選行權(quán)限方式(級聯(lián)效果)

    這篇文章主要介紹了Xadmin+rules實(shí)現(xiàn)多選行權(quán)限方式(級聯(lián)效果),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Pandas替換NaN值的方法實(shí)現(xiàn)

    Pandas替換NaN值的方法實(shí)現(xiàn)

    本文主要介紹了Pandas替換NaN值的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 編程小妙招:Python帶你玩轉(zhuǎn)Excel超鏈接

    編程小妙招:Python帶你玩轉(zhuǎn)Excel超鏈接

    掌握Python實(shí)現(xiàn)Excel加超鏈接的技巧,讓你的數(shù)據(jù)報告活起來,本指南將帶你輕松穿梭于單元格間,一行代碼搞定鏈接,別等了,跟我一起讓你的Excel工作表不僅聰明,還能“點(diǎn)”亮你的信息網(wǎng)絡(luò)!
    2023-12-12
  • python進(jìn)度條顯示-tqmd模塊的實(shí)現(xiàn)示例

    python進(jìn)度條顯示-tqmd模塊的實(shí)現(xiàn)示例

    這篇文章主要介紹了python進(jìn)度條顯示-tqmd模塊的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Flask 入門Web 微框架Hello Flask

    Flask 入門Web 微框架Hello Flask

    這篇文章主要介紹了 Flask 入門Web 微框架Hello Flask,F(xiàn)lask 是一個 Python 實(shí)現(xiàn)的 Web 微框架,之所以稱之為微框架,是因為 Flask 核心簡單且易于擴(kuò)展,有兩個主要依賴,WSGI工具集:Werkzeug和模板引擎:Jinja2,Flask 只保留了 Web 開發(fā)的核心功能,需要的朋友可以參考一下
    2021-11-11
  • python如何刪除文件、目錄

    python如何刪除文件、目錄

    在本篇文章里小編給大家整理的是關(guān)于python刪除文件、目錄的方法,需要的朋友們可以學(xué)習(xí)下。
    2020-06-06
  • Python判斷兩個文件是否相同與兩個文本進(jìn)行相同項篩選的方法

    Python判斷兩個文件是否相同與兩個文本進(jìn)行相同項篩選的方法

    今天小編就為大家分享一篇關(guān)于Python判斷兩個文件是否相同與兩個文本進(jìn)行相同項篩選的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Go語言基于Socket編寫服務(wù)器端與客戶端通信的實(shí)例

    Go語言基于Socket編寫服務(wù)器端與客戶端通信的實(shí)例

    這篇文章主要介紹了Go語言基于Socket編寫服務(wù)器端與客戶端通信的實(shí)例,包括實(shí)現(xiàn)基于自定義通訊協(xié)議的Socket通信,需要的朋友可以參考下
    2016-02-02

最新評論

江口县| 互助| 饶阳县| 冀州市| 清涧县| 新干县| 运城市| 新营市| 乐都县| 濮阳县| 新河县| 南江县| 和顺县| 乌兰察布市| 漳州市| 静乐县| 巴东县| 天长市| 锦屏县| 黑河市| 宝应县| 中牟县| 辽宁省| 班戈县| 曲水县| 和平区| 响水县| 龙井市| 宜丰县| 金寨县| 衢州市| 朔州市| 尉氏县| 八宿县| 盖州市| 偃师市| 大港区| 无锡市| 永仁县| 渑池县| 鹿泉市|