装饰器带参数的一个样例
#!/usr/bin/python # -*- coding: UTF-8 -*- #装饰器里面用参数的话,应用场景,个人理解是一些对要装饰的函数有条件的调用时,比如web服务中的,只对特定的http请求进行一个处理,其他的处理不关系 #在写装饰器的时候,外层函数的参数是接受被装饰的函数的首地址,而闭包函数的参数接受是被装饰函数的参数,返回的是闭包函数的首地址 #基于类来实现,实现是在__call__方法中 class ConditionDecorator(object): """ 条件装饰器 """ def __init__(self,condition): """ 用于接受装饰器参数 :param condition:判断条件 """ self._condition=condition def __call__(self,func): """ 用于接收函数 :param _func:被装饰函数 """ def _wrapper(*args,**kwargs): """ 用于接受被装饰函数参数 """ if self._condition: return func(*args,*kwargs) else: print("条件不满足,无法加载{__func__.__name__}") return _wrapper #基于函数来实现,装饰器要使用参数的话,那么他需要定义两个闭包函数,第一个闭包函数用来接受被装饰的函数首地址,第二个闭包函数用来接受被装饰函数的参数 """ say_hello=condition_decorater(condition)(say_hello) 第一步是:condition_decorater(condition)--->返回是是wrapper,wrapper函数的首地址 第二步是:condition_decorater(condition)(say_hello)--->使用wrapper函数对say_hello进行装饰,返回的是inner_wrapper,inner_wrapper函数的首地址 第三步是:say_hello(*args,**kwargs)--->执行的是inner_wrapper(*args,**kwargs),最终会调用到真正的say_hello函数 """ def condition_decorater(condition): """ 用于接收装饰器参数 :param condition:判断条件 """ def wrapper(func): """ 用于接受函数 :param func: 被装饰函数 """ def inner_wrapper(*args,**kwargs): """ 用于接收被装饰函数参数 """ if condition: return func(*args,**kwargs) else: print("条件不满足,无法加载") return inner_wrapper return wrapper a=1 b=1.0 """ 该装饰器的调用流程如下: say_hello=ConditionDecorator(condition=isinstance(a,int))(say_hello) 第一步:ConditionDecorator(condition=isinstance(a,int))---->实例化该类的一个对象 第二步:ConditionDecorator(condition=isinstance(a,int))(say_hello) 实例对象可调用--->本质上是调用该类的__call__方法 """ @ConditionDecorator(condition=isinstance(a,int)) def say_hello(name): print("哈喽,你好") @condition_decorater(condition=isinstance(b,int)) def say_hello1(name): print("哈喽,hello1") if __name__ == '__main__': say_hello("abc") say_hello1("efg")
运行结果:
D:\python3-code\Scripts\python.exe D:/python3-code/decorater.py 哈喽,你好 条件不满足,无法加载 Process finished with exit code 0
参考:https://blog.csdn.net/jczhou_0/article/details/109105996?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242