日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Python|裝飾器

 算法與編程之美 2020-11-05

一對象的概念

python的所有內(nèi)容都可以作為對象,這意味著這些內(nèi)容可以作為參數(shù)作用于其他的“對象”,這不難理解,就像在函數(shù)中,可以把另一個函數(shù)作為參數(shù),甚至是類作為參數(shù),,因此經(jīng)??吹胶瘮?shù)的“嵌套”使用。

def hi():

     return "hi yasoob!"

def doSomethingBeforeHi(func):

     print("我是在executing hi()之前的裝飾")

     print(func())

doSomethingBeforeHi(hi)

在這個例子中得到的輸出如下:

我是在executing hi()之前的裝飾

hi yasoob!

可以的看到:

之前定義的函數(shù)hi作為doSomethingBeforeHi這個函數(shù)的參數(shù),并且在輸出中并不影響它本身。

二裝飾器的作用

顧名思義,裝飾器的首要作用就是“裝飾”,它裝飾的種類有很多,只要是python的對象都可以被它所裝飾。那裝飾的意義在哪里呢?

在一個函數(shù)增加功能但是不改變其中代碼時,就可以使用裝飾器來完善這種功能,這樣做的意義在哪里呢?當這種新增功能需要運用到很多函數(shù)時,就只需要調(diào)用裝飾器,而不是在每個函數(shù)上去修改,這樣就節(jié)省了很多的時間和精力。

三裝飾器的用法

最簡單的裝飾器其實就是上面的案例,這也是最直接易懂的——將待“裝飾”的函數(shù)作為參數(shù)放入起“裝飾”作用的函數(shù)中。當然,python提供了更加簡潔且可用性更強的方法。

首先引入對應(yīng)的模塊,然后定義裝飾器,裝飾器的定義方法和函數(shù)一致,在裝飾器中,使用@wraps()的方法來接受一個函數(shù)進行封裝,在它之后定義需要增加的內(nèi)容,具體操作相信大家看代碼就一目了然了。

from functools import wraps#引入wraps模塊

def a_new_decorator1(a_func):#定義裝飾器

     @wraps(a_func)#接收“a_func“函數(shù)進行裝飾

     def wrapTheFunction1():#定義裝飾內(nèi)容

         print("我是在a_func ()之前的裝飾")

         a_func()#保留函數(shù)自身功能

         print("我是在a_func ()之后的裝飾")

     return wrapTheFunction1

在這個例子中,“wrapTheFunction1”就是定義的“裝飾”函數(shù),也可以理解成“裝飾”的方法。在裝飾器定義完成后,接下來就是它的封裝和使用了。封裝裝飾器的方法很簡單,只需要@符號加上裝飾器名稱即可。

@a_new_decorator1

調(diào)用裝飾器時,只需要在封裝好的裝飾器下面定義或者調(diào)用相應(yīng)的函數(shù)即可。

@a_new_decorator1

def a_function_requiring_decoration1():

     print("我是函數(shù)本身功能")

輸出上面的函數(shù)可以看到如下結(jié)果:

我是在a_func ()之前的裝飾

我是函數(shù)本身功能

我是在a_func ()之前的裝飾)

需要注意的是,調(diào)用一次裝飾器只能對一個函數(shù)裝飾一次,多余的函數(shù)將不被裝飾,這很像畫油畫,被裝飾的函數(shù)就像是畫板,即使兩張畫板疊在一起,顏色也只對最上層的畫板起作用。但是在畫油畫時,畫板顏色是可以被層層覆蓋的,這是不是意味著裝飾器也可以這樣疊加呢?我們來看下面的例子。

@a_new_decorator1

@a_new_decorator1

def a_function_requiring_decoration2():

print("我是另一個函數(shù)")

對它進行輸出,得到如下結(jié)果

我是在a_func ()之前的裝飾

我是在a_func ()之前的裝飾

我是另一個函數(shù)

我是在a_func ()之后的裝飾

我是在a_func ()之后的裝飾

通過輸出我們可以發(fā)現(xiàn)裝飾器效果也是可以層層疊加的,這樣就讓“裝飾”這個功能變得更加有可用性。


END

主  編   |   王文星

責  編   |   黃章魚

能力越強,責任越大。實事求是,嚴謹細致。    

                                                  ——where2go 團隊


微信號:算法與編程之美          

    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多