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

首頁 > 編程 > Python > 正文

python裝飾器decorator介紹

2019-11-25 18:04:53
字體:
來源:轉載
供稿:網友

一、裝飾器decorator

decorator設計模式允許動態地對現有的對象或函數包裝以至于修改現有的職責和行為,簡單地講用來動態地擴展現有的功能。其實也就是其他語言中的AOP的概念,將對象或函數的真正功能也其他輔助的功能的分離。

二、Python中的decorator

python中的decorator通常為輸入一個函數,經過裝飾后返回另一個函數。  比較常用的功能一般使用decorator來實現,例如python自帶的staticmethod和classmethod。

裝飾器有兩種形式:

復制代碼 代碼如下:

@A
def foo():
    pass

相當于:

復制代碼 代碼如下:

def foo():
    pass
foo = A(foo)

第二種為帶參數的:

復制代碼 代碼如下:

@A(arg)
def foo():
    pass

則相當于:

復制代碼 代碼如下:

def foo():
    pass
foo = A(arg)(foo)

可以看出第一種的裝飾器是個返回函數的函數,第二種的裝飾器是個返回函數的函數的函數。

python中的decorator可以多個同時使用,如下:

復制代碼 代碼如下:

@A
@B
@C
def f (): pass
   
# it is same as below
def f(): pass
f = A(B(C(f)))

三、Python中常用的decorator實例

decorator通常用來在執行前進行權限認證,日志記錄,甚至修改傳入參數,或者在執行后對返回結果進行預處理,甚至可以截斷函數的執行等等。

實例1:

復制代碼 代碼如下:

from functools import wraps
def logged(func):
    @wraps(func)
    def with_logging(*args, **kwargs):
        print (func.__name__() + " was called")
        return func(*args, **kwargs)
    return with_logging

@logged
def f(x):
   """does some math"""
   return x + x * x

print (f.__name__)  # prints 'f'
print (f.__doc__)   # prints 'does some math'

注意functools.wraps()函數的作用:調用經過裝飾的函數,相當于調用一個新函數,那查看函數參數,注釋,甚至函數名的時候,就只能看到裝飾器的相關信息,被包裝函數的信息被丟掉了。而wraps則可以幫你轉移這些信息,參見http://stackoverflow.com/questions/308999/what-does-functools-wraps-do

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 葵青区| 海林市| 广宗县| 浦东新区| 合江县| 崇信县| 苍南县| 云林县| 怀化市| 通海县| 泽州县| 会东县| 华坪县| 保康县| 东阿县| 修水县| 延吉市| 林甸县| 陵川县| 青神县| 通河县| 墨玉县| 溆浦县| 花莲县| 彩票| 社会| 内丘县| 临猗县| 安丘市| 大埔县| 台中县| 扎囊县| 丰台区| 石景山区| 奉化市| 银川市| 丹江口市| 北川| 东台市| 莎车县| 双辽市|