python裝飾器
創(chuàng)建裝飾器
- 裝飾器本質(zhì)上就是一個(gè)函數(shù)邢锯,這個(gè)函數(shù)接收其他函數(shù)作為參數(shù)榴啸,并將其以一個(gè)新的修改后的函數(shù)進(jìn)行替換网严。
- 最簡單的裝飾器就是本體函數(shù)(identify function)
def identify(f):
#A#
return f
然后就可以像下面這樣使用這個(gè)裝飾器:
@identify
def foo():
return 'bar'
它和下面的過程類似:
def foo():
return 'bar'
foo = identify(foo)
在#A#
處贩绕,可以把一批函數(shù)都需要進(jìn)行的操作都放在這,再用裝飾器的形式來裝飾那批函數(shù)赠法,來簡化代碼麦轰。
注冊裝飾器
_functions = {}
def register(f):
global _functions
_functions[f.name] = foo
return foo
使用##
@register
def foo():
return 'bar'
- 在這個(gè)例子中,函數(shù)被注冊并存儲(chǔ)在一個(gè)字典里砖织,以便后續(xù)可以根據(jù)函數(shù)名字提取函數(shù)
#### 裝飾器升級(jí)
- ```python
import functools
import inspect
def check_is_admin(f):
@functools.wraps(f)
#使用functools使返回的wrapper函數(shù)的屬性與原函數(shù)一致
def wrapper(*args, **kwargs):
#args得到函數(shù)傳參
func_args = inspect.getcallargs(f, *args, **kwargs)
#返回一個(gè)將參數(shù)名字和值作為鍵值對的字典款侵,不論參數(shù)的傳遞方式
if func_args.get('username') != 'admin':
raise Exception("This user is not allowed to get food")
return f(*args, **kwargs)
#return時(shí)執(zhí)行函數(shù),返回函數(shù)返回值侧纯,有點(diǎn)混新锈,注意
return wrapper
##使用##
@check_is_admin
def get_food(username, type='chocolate'):
return type + " nom nom nom!"
python方法類裝飾器
- 在python3中不僅可以向方法傳入該類的任意實(shí)例,還可以傳入任何對象眶熬,只要它包含方法期望的屬性
- 靜態(tài)方法
@staticmethod
- 類方法
@classmethod
第一個(gè)參數(shù)cls
- 抽象方法
import abc; @abc.abstractmethod