国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python中decorator使用實例

2020-02-23 00:42:38
字體:
來源:轉載
供稿:網友

在我以前介紹 Python 2.4 特性的Blog中已經介紹過了decorator了,不過,那時是照貓畫虎,現在再仔細描述一下它的使用。

關于decorator的詳細介紹在 Python 2.4中的What's new中已經有介紹,大家可以看一下。

如何調用decorator

基本上調用decorator有兩種形式

第一種:
代碼如下:
@A
def f ():

這種形式是decorator不帶參數的寫法。最終 Python 會處理為:
代碼如下:
f = A(f)

還可以擴展成:
代碼如下:
@A
@B
@C
def f ():
   

最終 Python 會處理為:
代碼如下:
f = A(B(C(f)))

注:文檔上寫的是@A @B @C的形式,但實際上是不行的,要寫成多行。而且執行順序是按函數調用順序來的,先最下面的C,然后是B,然后是A。因此,如果decorator有順序話,一定要注意:先要執行的放在最下面,最后執行的放在最上面。(應該不存在這種倒序的關系)

第二種:
代碼如下:
@A(args)
def f ():
   

這種形式是decorator帶參數的寫法。那么 Python 會處理為:
代碼如下:
def f():
_deco = A(args)
f = _deco(f)

可以看出, Python 會先執行A(args)得到一個decorator函數,然后再按與第一種一樣的方式進行處理。

decorator函數的定義

每一個decorator都對應有相應的函數,它要對后面的函數進行處理,要么返回原來的函數對象,要么返回一個新的函數對象。請注意,decorator只用來處理函數和類方法。

第一種:
針對于第一種調用形式
代碼如下:
def A(func):
    #處理func
    #如func.attr='decorated'
    return func
@A
def f(args):pass

上面是對func處理后,仍返回原函數對象。這個decorator函數的參數為要處理的函數。如果要返回一個新的函數,可以為:
代碼如下:
def A(func):
    def new_func(args):
        #做一些額外的工作
        return func(args) #調用原函數繼續進行處理
    return new_func
@A
def f(args):pass

要注意 new_func的定義形式要與待處理的函數相同,因此還可以寫得通用一些,如:

代碼如下:
def A(func):
    def new_func(*args, **argkw):
        #做一些額外的工作
        return func(*args, **argkw) #調用原函數繼續進行處理
    return new_func
@A
def f(args):pass

可以看出,在A中定義了新的函數,然后A返回這個新的函數。在新函數中,先處理一些事情,比如對參數進行檢查,或做一些其它的工作,然后再調原始的函數進行處理。這種模式可以看成,在調用函數前,通過使用decorator技術,可以在調用函數之前進行了一些處理。如果你想在調用函數之后進行一些處理,或者再進一步,在調用函數之后,根據函數的返回值進行一些處理可以寫成這樣:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 灯塔市| 轮台县| 罗田县| 兴化市| 马公市| 阳信县| 武义县| 稷山县| 宣恩县| 酒泉市| 神木县| 石泉县| 凉城县| 夹江县| 绩溪县| 静安区| 枣阳市| 泌阳县| 瑞金市| 洛川县| 清涧县| 英山县| 通河县| 岚皋县| 太仆寺旗| 杂多县| 武平县| 长垣县| 射阳县| 金坛市| 永靖县| 汕头市| 白银市| 如皋市| 华坪县| 东丰县| 扬州市| 启东市| 嘉黎县| 乌拉特中旗| 获嘉县|