Python自學筆記 9 裝飾器

2021-08-22 10:36:01 字數 2339 閱讀 2498

裝飾器是乙個函式,其主要用途是包裝另乙個函式或類。這種包裝的首要目的是光明正大地修改或增強被包裝物件的行為。其語法上使用特殊的符號 @ 表示裝飾器。

這裡摘錄廖雪峰老師部落格的部分內容!

函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式

def

func

(): print("hello world")

f = func

f() #咦!通過變數都可以呼叫函式啊

#函式物件有乙個__name__屬性,可以拿到函式的名字:

print(func.__name__)

現在,假設我們要增強函式func的功能,在函式呼叫前後自動列印日誌,但又不希望修改func函式的定義,這種在**執行期間動態增加功能的方式,稱之為「裝飾器」(decorator)。

本質上 裝飾器 就是乙個返回函式的高階函式

#先來看如下**

deftrace

(func):

defcallf

(*args, **kwargs):

print("calling %s: %s, %s\n" %

(func.__name__, args, kwargs))

r = func(*args, **kwargs)

print("%s returned %s\n" % (func.__name__, r))

return r

return callf

@trace

deffunc2

(x):

return x * x

print("the func2 value is %d", func2(3))

列印結果如下:

calling func2: (3,), {}

func2 returned 9

the func2 value is %d 9

其實我的本意是要列印在呼叫func2函式前後的啊!為什麼會列印在之前呢?

其原因是,我在print函式中呼叫了func2函式,大致意思如下:

呼叫 print( - - - - - - - - - - - - - ->)

- - - - - - - - - - - - - ||

- - - - - - - - - - -呼叫func2(3)

- - - - - - - - - - - - -||

但是由於我們編寫的裝飾器在func2函式前後都執行了列印

- - - - - - - - - - - - - ||

所以函式執行順序為:

先列印前一句,呼叫func2函式執行,在列印後一句,然後函式的結果返回給print函式,由print函式列印出結果,所以就有了如上的順序了。

把@trace放到func2()函式的定義處,相當於執行了語句: func2 = trace(func2 )

如果裝飾器本身需要傳入引數,那就需要編寫乙個返回裝飾器的更高階的函式

如下程式設計:

def

log(text):

deftrace

(func):

defcallf

(*args, **kwargs):

print("calling %s %s: %s, %s" %

(text, func.__name__, args, kwargs))

return func(*args, **kwargs)

return callf

return trace

@log('haha')

defnow

():print ('666')

now()

#其列印結果如下:

calling haha now: (), {}

666

在同時使用多個裝飾器時,他們必須出現在函式或者類之前的單獨行上。可以同時使用多個裝飾器

@foo

@bar

@sqam

defgork

():pass

#在這個例子中,裝飾器將按照他們出現的先後順序應用,結果等同於;

defgrok

(x):

pass

grok = foo(bar(sqam(grok)))

Python 裝飾器筆記

def wrap in tag b fn wrap in tag b 是真正的裝飾器 def return fn return defwrap in tag i fn def return fn return wrap in tag b wrap in tag i defhello return h...

python 裝飾器筆記

python的裝飾器是乙個函式b 用來裝飾另乙個函式a 使a具有b的功能,執行a方法同時 也會執行b方法 這種用法用到 內部函式 函式傳遞 沒有使用 def debug func print 1111 內部函式返回 入參函式 並執行 return func print 2222 裝飾器函式返回 內部...

Python 裝飾器筆記

def wrap in tag b fn wrap in tag b 是真正的裝飾器 def return fn return defwrap in tag i fn def return fn return wrap in tag b wrap in tag i defhello return h...