<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
python裝飾器在平常的python程式設計中用到的還是很多的,在本篇文章中我們先來介紹一下python中最常使用的@staticmethod裝飾器的使用。
之後,我們會使用兩種不同的方式來建立自己的自定義python裝飾器以及如何在其他地方進行呼叫。
@staticmethod是python開發者經常用來在一個類中宣告該函數是一個靜態函數時使用到的裝飾器,比如建立一個HelloWorld的python類,並且在其中使用該靜態裝飾器宣告其中的函數。
class HelloWorld(): def __init__(self): super(HelloWorld, self).__init__() @staticmethod def print_hello_world(): print('welcome to hello world!')
@staticmethod裝飾器一般是對於一些公共的函數,或是工具函數之類的函數進行宣告,宣告之後就不會將當前python類中的初始化變數資訊等傳入到該函數中,可以看到print_hello_world函數並沒有self作為引數變數。
接下來可以在初始化@staticmethod宣告的函數所在的類HelloWorld,並且呼叫print_hello_world函數。
hello_world = HelloWorld() hello_world.print_hello_world()
會發現控制檯直接列印出了welcome to hello world!這行字串。
實際上在python中的函數上面加入裝飾器只是為了在執行當前函數的邏輯之前去執行一些我們需要執行的業務功能,這樣的操作我們通過自定義自己的裝飾器也能夠實現同樣的效果。
其實,自定義裝飾器的過程也比較簡單,就是我們平常用到的函數或者python類的寫法就能夠實現。
自己實現裝飾器主要有兩種方式,一種是通過class類的方式來實現的,另外一種則是通過python函數巢狀的方式來實現的,下面我們先來通過第一種的方式來實現,也就是通過python類的方式來實現。
python類實現裝飾器
用python類來實現裝飾器時,必須明白一個知識點。python類中實際上預設有一個成員函數__call__,這個成員函數就是這個類被呼叫時的函數物件,若是需要自定義裝飾器實際上就是在python類的__call__函數中來實現裝飾器主要業務邏輯實現的。
class print_message(object): def __init__(self, function_): self.function_ = function_ def __call__(self): # TODO:這裡實際上是對傳入的函數返回值進行的裝飾,可以理解成是一種回撥。 print('裝飾器,{}'.format(self.function_()))
注意:在下面這行程式碼塊中一定要注意self.function_是一個函數物件,而self.function_()是一個函數返回值得效果。
print('裝飾器,{}'.format(self.function_()))
這樣,我們通過python類就已經實現了python裝飾器的效果,使用一個函數來試驗一下效果。
@print_message def hello_world(): return 'hello world!' hello_world()
呼叫使用了@print_message裝飾器的函數,它會返回我們預期的一個函數結果的列印。
# 裝飾器,hello world!
python函數巢狀實現裝飾器
上面的操作過程是通過重新定義了一個python類來實現裝飾器的效果的,這裡再使用函數巢狀的方式來實現。
因為,我們都知道在python中函數中再可以巢狀函數的,在函數中巢狀一個函數時上層的函數相對於子函數來說就是它的一個父級物件。
@print_message2 @print_message def hello_world3(): return 'hello world!' hello_world3() # 裝飾器,hello world! # 裝飾器2,None
使用函數巢狀的方式同樣實現了函數的裝飾器的效果,那麼思考一下若是有兩個裝飾器可以在同一個函數中使用嗎?
多個裝飾器呼叫
話不多說,為了證明兩個裝飾器能不能放到一個函數上面使用,我們直接試一下效果如何。
@print_message2 @print_message def hello_world3(): return 'hello world!' hello_world3() # 裝飾器,hello world! # 裝飾器2,None
從返回結果來看,首先是兩個裝飾器都是執行了,從資料結果列印的順序來看自定義的裝飾器的執行順序應該是從距離函數最近的裝飾器開始執行的,也就是從下往上的順序挨個執行該函數上面的裝飾器的.
另外,裝飾器2的結果為None,這是為什麼呢?
因為,第一個裝飾器執行的時候,它的引數應該是hello_world函數本身,但是當第二個裝飾器執行的時候第一個裝飾器並沒有返回結果知識做了列印,這個時候第二個裝飾器接收到的引數自然就是None了。
說實話帶引數的裝飾器在python中我見到的不多,不多在java中幾乎只要是裝飾器都是可以加引數執行的。
還是來介紹一下,算是屬於擴充套件知識吧,既然已經看到了這裡,不妨再多掌握個小技能吧,哈哈~
我們使用pytgon巢狀的函數功能來實現這個帶引數的裝飾器吧,個人覺得這種方便一些。
def header(message): def decorator(function_): def wrapper(): return '帶引數的裝飾器,引數:{0},{1}'.format(message, function_()) return wrapper return decorator @header('Python 集中營') def hello_world4(): return 'hello world!' print(hello_world4()) # 帶引數的裝飾器,引數:Python 集中營,hello world!
OK,帶引數的裝飾器果然生效了,給@header加上引數@header(‘Python 集中營’),上面裝飾器直接使用三層函數的巢狀來實現的。
第一層函數引數是我們需要自定義給裝飾器傳入的引數,第二層則是傳入的已經新增了裝飾器的函數本身,到了第三層才是真正的處理裝飾器自己的業務邏輯的。
到此這篇關於一文詳解如何建立自己的Python裝飾器的文章就介紹到這了,更多相關Python裝飾器內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45