# coding=utf-8
# 主題:測試python裝飾器的一些特性
def dec2(f):
print 'dec2'
return lambda x: 'bye, %s' % x
def dec(f):
print 'inside dec'
print f('call')
return lambda x: 'hello, %s' % x
@dec2
@dec
def greet_dec(s):
return "hi, %s with decorator." % s
def greet(s):
return 'hi, %s without decorator.' % s
# 什麼裝飾器decorator(@dec)?(對lambda並不適用)
# 它運用了一種優雅的語法,但說到底是還是乙個函式
# <--使用裝飾器-->
>>> @dec
... def greet_dec(s):
... return "hi, %s with decorator." % s
...inside dec
hi, call with decorator.
# 居然輸出了內容?很顯然,裝飾器被呼叫了。
# 在呼叫greet_dec之前, 也就是在給greet_dec宣告@dec的時候。裝飾器就已經起作用了。
>>> greet_dec('edward')
'hello, edward'
# 直譯器沒有像之前那樣輸出內容,說明@dec並沒有再次被呼叫。
# 在呼叫greet_dec之後,@dec並沒被呼叫,那麼@dec到底怎麼起作用的呢?
# 假設@dec的確接受了greet_dec作為引數並被直譯器所呼叫,那麼@dec作為乙個函式它的返回結果去哪了呢?
# 有一種可能性是,@dec僅僅在載入指令碼的時候才起作用,而@dec改變的不是別的而是greet_dec的命名空間所指向的函式物件。
# 而@dec恰恰是通過返回乙個callable()的物件來替換原來greet_dec的命名空間所指向的函式物件。
# 這下就應該能解釋的通,為什麼@dec沒有被呼叫,但是仍然改變了greet_dec的輸出結果了吧?
# 另外,包裹函式的最內層的@dec優先被執行;在有多個@dec的情況下,最外層的@dec返回callable()物件將作為greet_dec函式的替代品
python裝飾器測試 python裝飾器
一 了解下python裝飾器 套用個通用的說法,可以給被裝飾的物件 物件或函式 新增額外的功能 二 語法 咋用裝飾器?使用 語法糖 testdeftest case print pass 例子中,還缺少乙個test函式的定義,這裡先不寫。如果有傳參的需求,python支援可變引數和關鍵字引數的,這就...
python裝飾器 Python 裝飾器
簡言之,python裝飾器就是用於拓展原來函式功能的一種函式,這個函式的特殊之處在於它的返回值也是乙個函式,使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...
python裝飾器 裝飾器
由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2015 3 25 f now f 2015 3 25 函式物件有乙個 name 屬性,可以拿到函式的名字 now.name now f.name now 現在,假設我們要增強now 函式的...