python的引數裝飾器類

2021-08-19 06:29:41 字數 2034 閱讀 6701

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,驗...