首頁  >  文章  >  後端開發  >  Python直裝飾器是什麼

Python直裝飾器是什麼

藏色散人
藏色散人原創
2019-07-04 10:51:008546瀏覽

Python直裝飾器是什麼

首先,什麼是裝飾器?

比較官方的解釋是:

裝飾器是用來管理和呼叫函數和類別的一個可呼叫對象,也就是說分為函數裝飾器和類別裝飾器

這個定義函數我自己通俗化了一點,不然更加看不懂,其實我還有一句更加概括的話,可以解釋裝飾器:

裝飾器就是對被裝飾的對象(函數、類別)進行重構的,其可以在不改變原來物件的情況下調用物件時執行重構後的行為

這裡你可能就糊塗了,看不懂 

沒關係我們慢慢來! ! !

首先,裝飾者的語法你一定知道

def decorator(f):
    def wrapper(x,y):
        return x+y
    return wrapper
@decorator
def func(x,y):
    return 1
func(3,4)

那,看這段程式碼,你可能根據上面你有幾個疑問: 

一、decorator是什麼意思? 

二、這裡重構的行為是什麼? 

三、整個裝飾的行為或流程是怎麼樣的?

我們看上面那一段程式碼,很顯然,說過裝飾器就是一個可呼叫對象,這個沒問題吧,在上面的裝飾器它就是一個函數。 

重構的行為是什麼? 

上面的一段程式碼的重構行為就是講func的執行碼替換成了wrapper的執行碼,也就是說,程式碼的最終輸入是 7 而不是 1。

其實上面的兩個問題是廢話,我們解決了第三個問題,自然而然的就理解了!

好了,在繼續看之前我們記住一句話: 

裝飾器本身接受被裝飾的對象,裝飾器返回的可調用對象接受被裝飾對象的所有參數

一定要仔細看這句話,理解加記憶吧!

在上面那一段程式碼中

裝飾器是: decorator 

# 傳回的可呼叫物件是: wrapper 

被裝飾的物件是:func

好了,你先在套這個你去看看這個這個函數的執行流程

當然,這時候你還會有一個疑問: 

當呼叫func (3,4)的時候發生了什麼事?

此時:傳回的可呼叫物件(wrapper)給了func,你也可以理解為現在的func的程式碼是

def func(x,y):
    return x+y

這時的func就完全不是自己本身定義的func的,它是不是在某種意義上算是被重構了!

到這裡你是不是理解了什麼是裝飾器,應該是理解了吧!

不過我們還沒結束,因為我要讓你徹底的了解什麼是裝飾器!

之前我們說過,不只函數裝飾器,還有類別裝飾器,那接下來我們就看看類別裝飾器是怎麼運作的,我還是要把之前那段話貼在這裡,你別忘了!

裝飾器本身接受被裝飾的對象,裝飾器返回的可調用對象接受被裝飾對象的所有參數

class Decorator:
    def __init__(self,f):
        self.func = f
    def __call__(self,x,y):
        return self.func(x,y) + 1
@Decorator
def func(x,y):
    return x+y
func(3,4)
# 你来想想这时候的结果是什么?

我們來一步步的分析一下, 

首先,我們說裝飾器只接受被裝飾的物件做參數,也就是說此時有

Decorator(func)
 # 这段代码对应着第一句话
 # 接下来是
 func(3,4)
 # 这句话是不是触动了__call__方法
 # 接下来就是第二句话:返回的可调用对象接受被装饰对象的所有参数
 # 所以3,4就被传递给了__call__方法
 # 此时的func是什么
 return self.func(x,y) + 1
 # 也就是说结果为8,而不是7

接下來來點難的看看:

def decorator(f):
    def wrapper(self,x,y):
        return self.name + x + y
    return wrapper
class C:
    name = '土'
    @decorator
    def method(x,y):
        return x + y
ins = C()
myname = ins.method('行','孙')

思考一下這個答案是什麼? 

能想出來基本上理解了什麼是裝飾器了!

相關推薦:《Python教學

以上是Python直裝飾器是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn