python裝飾器
創(chuàng)建裝飾器
- 裝飾器本質(zhì)上就是一個(gè)函數(shù),這個(gè)函數(shù)接收其他函數(shù)作為參數(shù),并將其以一個(gè)新的修改后的函數(shù)進(jìn)行替換。
- 最簡(jiǎn)單的裝飾器就是本體函數(shù)(identify function)
def identify(f):
#A#
return f
然后就可以像下面這樣使用這個(gè)裝飾器:
@identify
def foo():
return 'bar'
它和下面的過(guò)程類似:
def foo():
return 'bar'
foo = identify(foo)
在#A#
處,可以把一批函數(shù)都需要進(jìn)行的操作都放在這,再用裝飾器的形式來(lái)裝飾那批函數(shù),來(lái)簡(jiǎn)化代碼。
注冊(cè)裝飾器
_functions = {}
def register(f):
global _functions
_functions[f.name] = foo
return foo
使用##
@register
def foo():
return 'bar'
- 在這個(gè)例子中,函數(shù)被注冊(cè)并存儲(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ù)名字和值作為鍵值對(duì)的字典,不論參數(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í)例,還可以傳入任何對(duì)象,只要它包含方法期望的屬性
- 靜態(tài)方法
@staticmethod
- 類方法
@classmethod
第一個(gè)參數(shù)cls
- 抽象方法
import abc; @abc.abstractmethod