• python函数四(装饰器进阶)


    一。开放封闭原则

      1.对扩展是开放的

        任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。

      2.对修改是封闭的

        比如我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。

    装饰器完美的遵循了开放封闭原则。

    二。函数的有用信息 

    def func():
        '''
        本函数主要用于绘图,实时接收数据
        :return:返回给前端某标签
        '''
        print(func.__doc__)
        print(func.__name__)
    func()
    # 结果:
    # 本函数主要用于绘图,实时接收数据
    #     :return:返回给前端某标签
    # func

    三。*args,**kwargs

    def wrapper(func):
        def inner(*args,**kwargs):
            '''执行函数前'''
            ret = func(*args,**kwargs)
            '''执行函数后'''
            return ret
        return inner
    
    @wrapper
    def func(a,b,c,d):      #接收函数时,加个*聚合
        print(111)    
    func(1,2,3,4)
    
    # f1(*[1,2,3,4])        #执行函数时,加个*打散

    四。装饰器进阶

      1.带参数的装饰器  

    import time
    flag = False
    def timmer_out(f):
        def timmer(func):
            def inner(*args,**kwargs):
                '''执行函数前操作'''
                if f:
                    start_time = time.time()
                    time.sleep(0.3)
                    ret = func(*args,**kwargs)
                    '''执行函数后操作'''
                    end_time = time.time()
                    print('执行效率%s'%(end_time - start_time))
                    return ret
                else:
                    ret = func(*args,**kwargs)
                    return ret
            return inner
        return timmer
    
    @timmer_out(flag)  # 1, timmer_out(flag)  返回 timmer  --->
    def f1():         # 2,  @timmer 就是你认识的装饰器 f1 = timmer(f1)
        print(666)
    f1()
    View Code

      2.多个装饰器装饰一个函数

    def wrapper1(func):
        def inner1(*args,**kwargs):
            '''执行函数前'''
            print(222)
            ret1 =func(*args,**kwargs)
            '''执行函数后'''
            print(333)
            return ret1
        return inner1
    
    def wrapper2(func):
        def inner2(*args,**kwargs):
            '''执行函数前'''
            print(555)
            ret2 = func(*args,**kwargs)
            '''执行函数后'''
            print(666)
            return ret2
        return inner2
    
    @wrapper1
    @wrapper2
    def func():
        print(111)
    func()
    #运行到@wrapper1时此时不运行,走下一步
    #运行到@wrapper2时,func = wrapper2(func),此时得到的是  func = wrapper2(func),返回值是inner2 ,即func---->inner2
    #之后再运行到@wrapper1,即func = wrapper1(inner2),返回值是inner1,即func----->inner1
    #接着调用func(),即调用inner1()
    # #再根据自上而下的运行规律即可以得到结果
    
    # 输出结果:
    # 222
    # 555
    # 111
    # 666
    # 333
    View Code

        

  • 相关阅读:
    SqlHelper
    C#中gridView常用属性和技巧介绍
    oracle中的存储过程例子
    log4j.properties配置详解
    Ant之build.xml
    jQuery源码
    jQuery实现分页
    mysql中log
    SQL只获取字段中的中文字符
    子Repeater获取父级Repeater绑定项的值
  • 原文地址:https://www.cnblogs.com/zhuzhaoyang/p/8418988.html
Copyright © 2020-2023  润新知