函数之装饰器

装饰器的本质:闭包函数

装饰器的功能:就是在不改变原函数调用方式的情况下,在这个函数的前后加上扩展功能

def timer(func):
    def inner(a):
        start = time.time()
        func(a)
        print(time.time() - start)
    return inner

@timer
def func1(a):
    print(a)

func1(1)
带参数的装饰器

装饰器的开放封闭原则:

        1、对扩展是开放的

        2、对修改是封闭的

装饰器的主要功能:就是在不改变函数调用方式的基础上在函数前、后添加功能

装饰器的固定方式

def timer(func):
    def inner(*args,**kwargs):
        '''执行函数之前要做的'''
        re = func(*args,**kwargs)
        '''执行函数之后要做的'''
        return re
    return inner
装饰器的固定方式

带参数的装饰器 

F = False
def outer(flag):
    def wrapper(func):
        def inner(*args,**kwargs):
            if flag:
                print('before')
                ret = func(*args,**kwargs)
                print('after')
            else:
                ret = func(*args, **kwargs)
            return ret
        return inner
    return wrapper

@outer(F)  #-->@wrapper  -->hahaha = wrapper(hahaha)  #-->hahaha == inner
def hahaha():
    print('hahaha')

@outer(F)   #shuangww = outer(shuangww)
def shuangww():
    print('shuangwaiwai')

shuangww()
hahaha()
带参数装饰器开关

多个装饰器装饰一个函数

def qqxing(func):  #func = pipixia_inner
    def qqxing_inner(*args,**kwargs):
        print('in qqxing:before')
        ret = func(*args,**kwargs)  #pipixia_inner
        print('in qqxing:after')
        return ret
    return qqxing_inner

def pipixia(func):  #dapangxie
    def pipixia_inner(*args,**kwargs):
        print('in pipixia:before')
        ret = func(*args,**kwargs)      #dapangxie
        print('in pipixia:after')
        return ret
    return pipixia_inner

#qqxing(pipixia_inner)  -->dapangxie = qqxing_inner()
@qqxing    #dapangxie = qqxing(dapangxie)  -->dapangxie = qqxing(pipixia(dapangxie)) -->
@pipixia   #dapangxie = pipixia(dapangxie)
def dapangxie():
    print("饿了么")
dapangxie()
多个装饰器装饰一个函数

多个装饰器应用场景:

   1.计算func的执行时间 @timmer
2.登录认证 #@auth

补充:
解耦  尽量的让代码分离。小功能之间的分离
解耦的目的 提高代码的重用性

          

原文地址:https://www.cnblogs.com/mengqingjian/p/7245370.html