黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

python裝飾器decorator介紹

系統 1985 0

一、裝飾器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


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論