装饰器带参数的一个样例

#!/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  

  

posted @ 2021-04-16 12:07  一切都是当下  阅读(76)  评论(0编辑  收藏  举报