zoukankan      html  css  js  c++  java
  • 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

        

  • 相关阅读:
    IIS6.0服务器架站无法访问解决方案总结
    DNN中做支持多语言的模块
    在dotnetnuke中创建 parent portal
    DNN,Rainbow资源
    2005年岁末,各种主流CMS系统的比较和汇总
    在DNN中获取所有模块信息
    学习dnn的新资源,sooooooooo great!!
    DNN的电子商务模块
    DNN学习笔记
    也学ASP.NET 2.0 AJAX 之二:使用Timer控件
  • 原文地址:https://www.cnblogs.com/zhuzhaoyang/p/8418988.html
Copyright © 2011-2022 走看看