裝飾器 立業的部落格

2022-09-24 02:45:09 字數 2554 閱讀 5718

在**執行期間動態增加函式功能的方式,稱之為裝飾器(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 函式的...