測試python裝飾器decorator

2021-07-05 06:29:56 字數 1247 閱讀 2967

# 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 函式的...