python函数四(装饰器进阶)

Posted 忆殇★伤忆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.带参数的装饰器  

技术分享图片
flag = True
def wrapper_out(flag):
    def wrapper(func):
        def inner(*args,**kwargs):
            ‘‘‘执行函数前‘‘‘
            if flag:
                ret = func(*args,**kwargs)
                ‘‘‘执行函数后‘‘‘
                print(222)
                return ret
            else:
                ret = func()
                return ret
        return inner
    return wrapper

@wrapper_out(flag)     #第一步是调用 wrapper_out(flag),接收到返回值wrapper
def func():           #第二步是@wrapper,即func = wrapper(func)
    print(111)
func()

# 输出结果:
# 111
# 222

# 当flag = False时,调用inner()时走else
# 输出结果:   111
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

 

    

以上是关于python函数四(装饰器进阶)的主要内容,如果未能解决你的问题,请参考以下文章

Python进阶装饰器(Decorator)

Python进阶第九篇装饰器

python开发函数进阶:装饰器

1Python进阶强化训练之装饰器使用技巧进阶

Python进阶精华-编写装饰器为被包装的函数添加参数

Python函数--装饰器进阶