在**執行期間動態增加函式功能的方式,稱之為裝飾器(decorator),它是乙個返回函式的高階函式
通過decorator可以增強函式的功能,定義起來有點複雜,但使用起來非常靈活和方便
在物件導向(oop)的設計模式中,decorator被稱為裝飾模式
oop的裝飾模式需要通過繼承和組合來實現,而python除了能支援oop的decorator外,直接從語法層次支援decorator
python的decorator可以用函式實現,也可以用類實現
使用示例
函式的__name__屬性
函式物件都有乙個__name__屬性,通過該屬性可獲取函式名
def now():
print('2015-3-25')
f = now
print(now.__name__) #輸出:'now'
print(f.__name__) #輸出:'now'使用修飾器
def log(func):
def wrapper(*args, **kw):
print('call %s():' % func.__name__) #在wrapper()函式內,首先列印日誌
return func(*args, **kw) #再緊接著呼叫原始函式
return wrapper
@log #把@log放到now()函式的定義處,執行now()時就相當於執行:now = log(now)
def now():
print('2019-5-28')
now() #呼叫now()將執行新函式,即在log()函式中返回的wrapper()函式
#輸出:call now():
# 2019-5-28
#由於log()是乙個decorator,返回乙個函式,所以,原來的now()函式仍然存在,只是現在同名的now變數指向了新的函式使用修飾器(帶引數)
def log(text):
def decorator(func):
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator
#相當於執行:now = log('execute')(now),即log('execute')會返回乙個函式decorator,
#然後在把now作為引數傳遞給函式decorator執行decorator(now),再返回wrapper並賦給now
@log('execute')
def now():
print('2019-5-28')
now()
#輸出:execute now():
# 2019-5-28
print(now.__name__) #輸出:wrapper
#因為log('execute')(now)返回的是wrapper函式
#所以需要把原始函式的__name__等屬性複製到wrapper()函式中,否則有些依賴函式簽名的**執行就會出錯通過__name__屬性獲取原函式名(修飾器)
import functools
def log(func):
@functools.wraps(func) #若要返回原函式__name__屬性,直接在最後返回的函式定義上追加@functools.wraps(func)即可
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
#python內建的functools.wraps,專門用於實現wrapper.__name__ = func.__name__,不需要編寫wrapper.__name__ = func.__name__這樣的**
@log
def now():
print('2019-5-28')
print(now.__name__) #輸出:now,因為log('execute')(now)返回的是wrapper函式通過__name__屬性獲取原函式名(帶引數修飾器)
import functools
def log(text):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator
@log('execute')
def now():
print('2019-5-28')
print(now.__name__) #輸出:now,因為log('execute')(now)返回的是wrapper函式
部落格361 Python裝飾器
內容 記錄python的裝飾器 裝飾器 python的裝飾器 decorator 可以說是python的乙個神器,它可以在不改變乙個函式 和 呼叫方式的情況下給函式新增新的功能。裝飾器本質 python的裝飾器本質上是乙個巢狀函式,它接受被裝飾的函式 func 作為引數,並返回乙個包裝 過的函式。這...
裝飾器之類裝飾器
外部的方法至今都玩過了,現在來思索一下的方法這麼裝飾 類方法修飾器 類的方法唯一的特殊點在於,self內部是可以呼叫的,但是在外部卻是隱藏的,那這個怎麼搞 為求穩妥,先定參修飾乙個 def godme fun def godme self,message print before fun self,...
python裝飾器 裝飾器
由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2015 3 25 f now f 2015 3 25 函式物件有乙個 name 屬性,可以拿到函式的名字 now.name now f.name now 現在,假設我們要增強now 函式的...