python裝飾器decorator介紹
一、裝飾器decorator
decorator設(shè)計(jì)模式允許動(dòng)態(tài)地對(duì)現(xiàn)有的對(duì)象或函數(shù)包裝以至于修改現(xiàn)有的職責(zé)和行為,簡(jiǎn)單地講用來(lái)動(dòng)態(tài)地?cái)U(kuò)展現(xiàn)有的功能。其實(shí)也就是其他語(yǔ)言中的AOP的概念,將對(duì)象或函數(shù)的真正功能也其他輔助的功能的分離。
二、Python中的decorator
python中的decorator通常為輸入一個(gè)函數(shù),經(jīng)過(guò)裝飾后返回另一個(gè)函數(shù)。 比較常用的功能一般使用decorator來(lái)實(shí)現(xiàn),例如python自帶的staticmethod和classmethod。
裝飾器有兩種形式:
@A
def foo():
pass
相當(dāng)于:
def foo():
pass
foo = A(foo)
第二種為帶參數(shù)的:
@A(arg)
def foo():
pass
則相當(dāng)于:
def foo():
pass
foo = A(arg)(foo)
可以看出第一種的裝飾器是個(gè)返回函數(shù)的函數(shù),第二種的裝飾器是個(gè)返回函數(shù)的函數(shù)的函數(shù)。
python中的decorator可以多個(gè)同時(shí)使用,如下:
@A
@B
@C
def f (): pass
# it is same as below
def f(): pass
f = A(B(C(f)))
三、Python中常用的decorator實(shí)例
decorator通常用來(lái)在執(zhí)行前進(jìn)行權(quán)限認(rèn)證,日志記錄,甚至修改傳入?yún)?shù),或者在執(zhí)行后對(duì)返回結(jié)果進(jìn)行預(yù)處理,甚至可以截?cái)嗪瘮?shù)的執(zhí)行等等。
實(shí)例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()函數(shù)的作用:調(diào)用經(jīng)過(guò)裝飾的函數(shù),相當(dāng)于調(diào)用一個(gè)新函數(shù),那查看函數(shù)參數(shù),注釋,甚至函數(shù)名的時(shí)候,就只能看到裝飾器的相關(guān)信息,被包裝函數(shù)的信息被丟掉了。而wraps則可以幫你轉(zhuǎn)移這些信息,參見(jiàn)http://stackoverflow.com/questions/308999/what-does-functools-wraps-do
- Python?Decorator裝飾器的創(chuàng)建方法及常用場(chǎng)景分析
- python?裝飾器(Decorators)原理說(shuō)明及操作代碼
- Python語(yǔ)法詳解之decorator裝飾器
- 如何實(shí)現(xiàn)一個(gè)python函數(shù)裝飾器(Decorator)
- 深入了解和應(yīng)用Python 裝飾器 @decorator
- Python裝飾器(decorator)定義與用法詳解
- 分析Python中設(shè)計(jì)模式之Decorator裝飾器模式的要點(diǎn)
- Python裝飾器decorator用法實(shí)例
- Python中的Decorator裝飾器的使用示例
相關(guān)文章
PyQt5結(jié)合QtDesigner實(shí)現(xiàn)文本框讀寫操作
本文將結(jié)合實(shí)例代碼,介紹PyQt5結(jié)合QtDesigner實(shí)現(xiàn)文本框讀寫操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
python gensim使用word2vec詞向量處理中文語(yǔ)料的方法
這篇文章主要介紹了python gensim使用word2vec詞向量處理中文語(yǔ)料的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
python神經(jīng)網(wǎng)絡(luò)Xception模型復(fù)現(xiàn)詳解
這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡(luò)Xception模型復(fù)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Python求一批字符串的最長(zhǎng)公共前綴算法示例
這篇文章主要介紹了Python求一批字符串的最長(zhǎng)公共前綴算法,涉及Python針對(duì)字符串的遍歷、判斷、計(jì)算等相關(guān)操作技巧,需要的朋友可以參考下2019-03-03
使用Python實(shí)現(xiàn)ELT統(tǒng)計(jì)多個(gè)服務(wù)器下所有數(shù)據(jù)表信息
這篇文章主要介紹了使用Python實(shí)現(xiàn)ELT統(tǒng)計(jì)多個(gè)服務(wù)器下所有數(shù)據(jù)表信息,ETL,是英文Extract-Transform-Load的縮寫,用來(lái)描述將數(shù)據(jù)從來(lái)源端經(jīng)過(guò)抽取(extract)、轉(zhuǎn)換(transform)、加載(load)至目的端的過(guò)程,需要的朋友可以參考下2023-07-07
TensorFlow實(shí)現(xiàn)非線性支持向量機(jī)的實(shí)現(xiàn)方法
本篇文章主要介紹了TensorFlow實(shí)現(xiàn)非線性支持向量機(jī)的實(shí)現(xiàn)方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
python通過(guò)郵件服務(wù)器端口發(fā)送郵件的方法
這篇文章主要介紹了python通過(guò)郵件服務(wù)器端口發(fā)送郵件的方法,涉及Python發(fā)送郵件的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
python實(shí)現(xiàn)的讀取網(wǎng)頁(yè)并分詞功能示例
這篇文章主要介紹了python實(shí)現(xiàn)的讀取網(wǎng)頁(yè)并分詞功能,結(jié)合實(shí)例形式分析了Python使用requests模塊讀取網(wǎng)頁(yè),以及jieba庫(kù)分詞的相關(guān)操作技巧,需要的朋友可以參考下2019-10-10
Python實(shí)現(xiàn)微博動(dòng)態(tài)圖片爬取詳解
這篇文章主要為大家介紹了如何利用Python中的爬蟲實(shí)現(xiàn)微博動(dòng)態(tài)圖片的爬取,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起動(dòng)手試一試2022-03-03

