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

 

    

posted @ 2018-02-05 18:58  忆殇★伤忆  阅读(178)  评论(0编辑  收藏  举报