python 裝飾器的用法

2021-08-20 07:24:31 字數 3071 閱讀 9709

先從乙個小例子開始,然後逐步引出裝飾器的作用。

def name(name = 'james'):

print('my name is {}.'.format(name))

name()

輸出結果為:

my name is james.
如果此時想在列印「my name is...」之前加上打招呼的語句,且不能修改name()函式,就可以使用裝飾器。

def greeting(func):

print('nice to meet you!')

return func(*args, **kargs)

@greeting

def name(name = 'james'):

print('my name is {}.'.format(name))

name()

print(name.__name__)

輸出結果為:

nice to meet you!

my name is james.

單步執行這段加入裝飾器的**(使用spyder ide),看看裝飾器是如何工作的。

執行到def name(name = 'james')這行後,執行step in操作,立即跳轉到def greeting(func)這行,在ipdb中輸入func(),返回結果為:

ipdb> func()

my name is james.

說明greeting()內帶入的引數是name()函式。

然後就會跳出greeting(func)函式。繼續執行,直到執行完name()這行**後,然後就會輸出:

nice to meet you!

my name is james.

此時,在ipdb中輸入name,返回結果為:

ipdb> name
執行完最後一行後,顯示:

我們重頭再回顧下剛才這段**,然後理解一下裝飾器的工作原理。

def greeting(func):

print('nice to meet you!')

return func(*args, **kargs)

@greeting

def name(name = 'james'):

print('my name is {}.'.format(name))

name()

print(name.__name__)

@後面緊跟乙個函式(此處是greeting()函式),這個函式必須有定義

@greeting這行後緊跟乙個函式,這個函式是greeting(func)函式的輸入引數。在該例子中,greeting()函式的輸入引數是name()函式,即func=name。所以,當執行func()的時候,實際上是執行了name()函式

def greeting(func):

print('nice to meet you!')

return func(*args, **kargs)

b. 使用python內建的functools.wraps:

import functools

def greeting(func):

@functools.wraps(func)

print('nice to meet you!')

return func(*args, **kargs)

希望按照個人意願隨意輸出打招呼的話,而不僅僅只是「nice to meet you!」,可以在@greeting後面加入引數,例如@greeting("hello, everyone!"),此時,就需要在greeting()函式中增加一層。

import functools

def greeting(text):

def decorator(func):

@functools.wraps(func)

print(text)

return func(*args, **kargs)

return decorator

@greeting("hello, everyone!")

def name(name = 'james'):

print('my name is {}.'.format(name))

name()

print(name.__name__)

可以看到,greeting()函式的輸入引數是打招呼的話,而不是@greeting下面一行的name。執行完greeting()後,返回decorator()函式,該函式帶有輸入引數,為name()函式。

@greeting("hello, everyone!")

def name(name = 'james'):

上面這兩句相當於:

decorator(name)
最後返回:

目前有乙個需求,同時支援@greeting和@greeting()兩種裝飾器。

import functools

def greeting(text_or_func):

if not isinstance(text_or_func, str):

@functools.wraps(text_or_func)

print('nice to meet you!')

text_or_func(*args, **kargs)

if isinstance(text_or_func, str):

def decorator(text_or_func):

print(text_or_func)

text_or_func(*args, **kargs)

return decorator

@greeting()

def name(name = 'james'):

print('my name is {}.'.format(name))

name()

python 裝飾器的用法

為什麼要使用裝飾器?在不改變原函式功能的情況,為了新增新的功能 我們可以在函式執行前後給函式新增新的功能 1 defouter func 2 fun 等於原f1函式 3def inner 4print ccccc 5 r func 6print dddd 7returnr8 return inner...

python函式裝飾器的用法

一 什麼是裝飾器 用來給其他固定函式增加其他功能的一種函式。裝飾器的實現是函式裡面巢狀函式,讓其他函式在不需要做任何 改動的前提下增加額外功能。裝飾器需要傳遞乙個函式,返回值也是乙個函式物件 二 裝飾器的應用舉例 1.需求 使用者登陸驗證的裝飾器,如果使用者登陸成功,則執行被裝飾的函式,如果登陸失敗...

python函式裝飾器 的用法

是python中的乙個語法糖,decorator表示宣告乙個函式裝飾器,這條宣告語句中,decorator通過 被宣告為了函式裝飾器,其作用是對緊接著定義的函式進行進一步的裝飾,並返回與被裝飾函式同名的函式。decorator用法規則 1 裝飾器函式decorator需要先定義 2 當要裝飾乙個函式...