1、在python中有裝飾器函式:
def innner(*args, **kwargs):
# 需要裝飾的**
result = func()
# 需要裝飾的**
return result
return innner
@my_adorn
def fun():
pass
2、另外還引數裝飾器函式,也叫工廠裝飾器函式,用於解決裝飾器函式無法傳入其他引數
def my_adorn(func):
def get_arguments(*args):
def my_adorn(func):
def innner(*args, **kwargs):
# 需要裝飾的**
print(args) # 最內部的函式可以使用最外面傳入的引數
result = func()
# 需要裝飾的**
return result
return innner
return my_adorn
@my_adorn(引數)
def fun():
pass
3、還有乙個是裝飾器類,將裝飾器函式封裝成類,方便在類中使用
class myadorn(object):
def __init__(self,func):
self.__func = func
def __call__(self, *args, **kwargs):
# 需要裝飾的**
result = self.__func()
# 需要裝飾的**
return result
@myadorn
def fun():
pass
4、重點來了,想了一晚上在考慮裝飾器類可不可以傳入引數呢,經過各種測試,除錯,終於實現了,
可能方法並不是最完美的,如有更好的解決方法歡迎提出。
下面貼出自己想的引數裝飾器類(我叫它工廠裝飾器類):
# 如已經有**並想法相同純屬巧合哈……歡迎多交流
class routelist(object):
# 建立乙個靜態變數用來儲存第一次也就是裝飾函式時傳入的引數
# 由於會進行兩遍init定義
my_tuple = str() # 先定義為字串,後面會傳入乙個元組,如果開始定義為元組後期不能賦值
def __init__(self, *args): # 為了通用使用元組接收
self.list = args
# 由於第二次傳入的是類物件,防止第二次的值對靜態值進行修改
if type(args[0]) != type:
routelist.my_tuple = args
def __call__(self,*args, **kwargs):
return inner(*args, **kwargs) # 返回裝飾器類
# 裝飾器類函式
class inner(routelist):
def __init__(self, func):
self.func = func
# 此時傳入的是父類,用於呼叫類屬性
super().__init__(routelist)
def __call__(self, *args, **kwargs):
# 得到裝飾器開始傳入的引數,結果是元組,也用下標分別取出
print(self.list[0].my_tuple)
result = self.func(*args, **kwargs)
return result
@routelist('aaa')
def p1(num):
print(123)
return(num)
print(p1(4456))
# 結果為:
('aaa',)
1234456
python帶引數的類裝飾器
coding utf 8 author baoshan 帶引數的類裝飾器 和不帶引數的類裝飾器有很大的不同 類裝飾器的實現,必須實現 call 和 init 兩個內建函式。init 不再接收被裝飾函式,而是接收傳入引數 call 接收被裝飾函式,實現裝飾邏輯 class logger object ...
python帶引數的類裝飾器
摘自 coding utf 8 author baoshan 帶引數的類裝飾器 和不帶引數的類裝飾器有很大的不同 類裝飾器的實現,必須實現 call 和 init 兩個內建函式。init 不再接收被裝飾函式,而是接收傳入引數 call 接收被裝飾函式,實現裝飾邏輯 class logger obje...
Python 裝飾器,帶有引數的裝飾器
demo.py 裝飾器,帶引數的裝飾器 def set level level num def set func func def call func args,kwargs if level num 1 print 許可權級別1,驗證 elif level num 2 print 許可權級別2,驗...