激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - Python回調(diào)函數(shù)用法實例詳解

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

2020-07-19 10:37tianmo2010 Python

這篇文章主要介紹了Python回調(diào)函數(shù)用法,以實例形式較為詳細的分析了Python回調(diào)函數(shù)的定義、功能及相關(guān)使用技巧,需要的朋友可以參考下

本文實例講述了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ù)的實現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時由另外的一方調(diào)用的,用于對該事件或條件進行響應(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)用是一種類似消息或事件的機制,不過它的調(diào)用方向剛好相反,接口的服務(wù)在收到某種訊息或發(fā)生某種事件時,會主動通知客戶方(即調(diào)用客戶方的接口)。回調(diào)和異步調(diào)用的關(guān)系非常緊密,通常我們使用回調(diào)來實現(xiàn)異步消息的注冊,通過異步調(diào)用來實現(xiàn)消息的通知。同步調(diào)用是三者當(dāng)中最簡單的,而回調(diào)又常常是異步調(diào)用的基礎(chǔ),因此,下面我們著重討論回調(diào)機制在不同軟件架構(gòu)中的實現(xiàn)。

三、一個小例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#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ū)ο髮崿F(xiàn)的例子:

當(dāng)你要加入回調(diào)(Callback)功能的時候,代碼往往會偏重于回調(diào)的實現(xiàn)而不是問題本身了。一個解決方法就是實現(xiàn)一個通用的基礎(chǔ)類來解決回調(diào)的需求,然后再來實現(xiàn)你為某個事件(Event)所綁定(Binding)的方法(Method)。

代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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í)行(即注冊了全部的事件)。

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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 热99精品视频 | 国产成人高潮免费观看精品 | 欧美大穴 | 主播粉嫩国产在线精品 | 日韩视频观看 | 在线亚洲欧美 | 亚洲一区 国产精品 | 一级视频在线播放 | 成人羞羞网站入口 | 午夜精品久久久久久久96蜜桃 | 日本精品视频一区二区三区四区 | jizzzxxxxhd| 色播av在线 | 亚洲婷婷日日综合婷婷噜噜噜 | 亚洲精品欧美二区三区中文字幕 | 国产一区二区三区四区五区加勒比 | 毛片a片| 99热99精品| 渔夫荒淫艳史 | 娇喘在线| 国产毛片aaa一区二区三区视频 | 视频一区二区三区在线播放 | 在线香蕉视频 | 欧美毛片 | 激情视频日韩 | 国产免费一区二区三区最新不卡 | 一级做a爱片久久毛片a高清 | 免费中文视频 | 黄色av网站免费看 | 免费a级作爱片免费观看欧洲 | 一日本道久久久精品国产 | 欧美视频首页 | 亚洲一区二区三区在线免费观看 | 羞羞电影在线观看www | 黄色av网站在线观看 | 一级外国毛片 | 国产91av视频 | xxxxxx打针视频vk| 久久久tv| 少妇一级淫片免费看 | 午夜视频在线观看免费视频 |