装饰器带参数的一个样例
#!/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

浙公网安备 33010602011771号