1. 程式人生 > >python 裝飾器簡單釋義

python 裝飾器簡單釋義

python 裝飾器簡單釋義


Tag

雖然我講的不一定都是準確的,畢竟我也是個Python新手,具體的一些深入的原理還要靠大家自己去別的權威的地方瞭解。並且這裡我也沒有講到namespace的東西。不過可以保證的是,看了這一篇文章,你一定能夠有一個“裝飾器”的思維。然後再通過你去檢視其它關於裝飾器的資料,這樣才能真正弄懂它。這也是我這篇文章所能達到的高度,並不是要你看完就完全知道裝飾器,而是能夠有一個“裝飾器”的思維,對檢視其它資料有不小的幫助。

正文

裝飾器本身就是一個函式,這裡設為A,這個函式把另一個函式B作為它的引數,然後在裝飾器這個函式A中將引數函式B進行修改,這樣,函式B就被改變了。而“改變B”這件事本身就是裝飾器的意義。(參考上邊的Tag部分)

舉個例子:(為了不使問題更加複雜,這裡我直接用不規範的函式命名方式)

# 引數函式,就是要“被裝飾”的函式
def B():
    print("你的益達!")

# 裝飾器,就是去“裝飾”另一個函式的函式
def A(func):
    def deco():
        func()
        print("再說一次-你的益達!")
    return deco

# 下邊是操作與對應結果
B() # TIME 1
B = A(B)
B() # TIME 2
-----------
# TIME 1中的結果:
你的益達!
# TIME 2中的結果 :
你的益達!
再說一次-你的益達!

可以看到,通過A的裝飾,B與之前相比確實發生了變化。


然後我們把它改一下,讓它更好玩,也更加便於記憶:(其實是展示裝飾器的其它能力。。。)

def B(who):
    print("%s的益達!" % who)

def A(func):
    def deco(who):  
        who = "我"
        print("哦對,是")
        func(who)
    return deco

# 下邊是操作與對應結果
B("你") # TIME 1
B = A(B)
B("你") # TIME 2
-----------
# TIME 1中的結果:
你的益達! # TIME 2中的結果 : 哦對,是 我的益達! # 引數“你”==> “我”

這一次,我們在被裝飾函式B上加了引數,然後它就可以被裝飾器A直接操作了,返回deco之後,發現B函式的引數也被改變了。


最後,python用@做語法糖來將我們上邊的程式碼進行簡化,具體是

# 兩個函式跟上邊的程式碼一樣,只是在B的定義上邊加了@A
def A(func):
    def deco(who):  
        who = "我"
        print("哦對,是")
        func(who)
    return deco

@A
def B(who):

    print("%s的益達!" % who)

然後我們就可以把那一句B = A(B)去掉了,因為那個@A... 就是這一句的語法糖。它們是等價的。
也就是直接:B("你") 會輸出:
哦對,是
我的益達!

總結

其實到了這裡,大家就可以有一個我所謂的“裝飾器的思維”了。就是讓你在學習裝飾器的過程中不會被其它各種東西擾亂了主要程序。然後就要靠大家自己去查詢其它裝飾器的資料來理解了。網上有很多,我就不介紹了。