zoukankan      html  css  js  c++  java
  • 装饰器带参数的一个样例

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

      

  • 相关阅读:
    Yii2 国际化的问题 zh-CN
    Yii2归档安装法
    MySQL性能优化的最佳20+条经验
    Jquery 选择器汇总
    关于MooTools你应该熟知的6个基本知识
    Android开发效率—Eclipse快捷键
    Failed to fetch URL http://dl-ssl.google.com/android/repository/addons_list-2.xml, reason: Connectio (andriod sdk manager) http://dl-ssl.google.com/android上不去解决方案
    Windows下搭建objective C开发环境
    android studio创建项目
    android studio 安装与环境搭建
  • 原文地址:https://www.cnblogs.com/potato-chip/p/14666374.html
Copyright © 2011-2022 走看看