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',)
123
4456