按照 python 的程式設計原則,當乙個函式被定義後,如要修改或擴充套件其功能應盡量避免直接修改函式定義的**段,否則該函式在其他地方被呼叫時將無法正常執行。因此,當需要修改或擴充套件已被定義的函式的功能而不希望直接修改其**時,可以使用裝飾器。
先來看乙個簡單的例子:
def func1(function):
print("這裡是執行function()函式之前")
function()
print ("這裡是執行function ()函式之後")
@func1
def func2():
print ("正在執行 function ()函式")
上述**的執行結果如下所示:
>>> def func1(function):
... print("這裡是執行function()函式之前")
... function()
... print ("這裡是執行function()函式之後")
>>> @func1
def func2():
. print ("正在執行 function ()函式")
這裡是執行function()函式之前
正在執行 function()函式
這裡是執行function()函式之後
這裡@func1
等效於func1(func2)
在 python 中一切皆是物件,所以裝飾器本質上是乙個返回函式的高階函式。結合之前介紹的關鍵字引數,可以將乙個函式作為其外部函式的返回值,例如:
def func1(arg = true):
def func2():
print("this is func2() function")
def func3():
print("this is func3() function")
if arg == true:
return func2
else :
return func3
func1()()
上述**的執行結果如下所示。
>>> def func1(arg = true):
... def func2():
... print("this is func2() function")
... def func3():
... print("this is func3() function")
... if arg == true:
... return func2
... else :
... return func3
>>> func1()()
this is func2() function
可以看到,呼叫 func1( ) 時實際上執行了 func2( ) 函式,第二對括號是用以執行 func2( ) 函式的,如果不寫這對括號,將只會得到 func2( ) 函式的引用資訊,如圖下所示。
>>> def func1(arg = true):
... def func2():
... print("this is func2() function")
... def func3():
... print("this is func3() function")
... if arg == true:
... return func2
... else :
... return func3
>>> func1()
.func2 at 0x0000014ed8d663a0>
裝飾器也支援巢狀,巢狀的裝飾器的執行順序是從裡向外,最先呼叫最裡層的裝飾器,最後呼叫最外層的裝飾器,例如:
@a@b
@cdef f()
pass
將按照以下順序執行:
f = a(b(c(f)))
python裝飾器解析(一)
裝飾器是一種著名的設計模式,允許我們動態的為乙個物件來新增一些額外的功能而無需去修改它所在的類或者是建立新類。python中的函式也是一種物件,下面用幾個函式例項來說明python中的裝飾器。首先從最簡單的開始,假設我們有如下的函式 def my func print do something 現在...
python裝飾器的詳細解析
寫在前面 python裝飾器 fuctional decorators 就是用於拓展原來函式功能的一種函式,目的是在不改變原函式名 或類名 的情況下,給函式增加新的功能。這個函式的特殊之處在於它的返回值也是乙個函式,這個函式是內嵌 原 函式的函式。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入...
Python3裝飾器解析
實現裝飾器知識儲備 1.函式即 變數 白話 函式實參 當作另乙個函式的形參 2.高階函式 a 把乙個函式名當作實參傳給另乙個函式 在不修改被裝飾函式源 的情況下為其新增功能 b 返回值中包涵函式名 說白了,此函式名是巢狀函式名 不修改函式的呼叫方式 3.巢狀函式 高階函式 巢狀函式 裝飾器 詳解im...