Python面向切面编程的装饰器模式

装饰器是什么?他有什么特点?

    装饰器就是对被装饰的对象(函数、类)进行重构的,其可以在不改变原来对象的情况下调用对象时执行重构后的行为
    
特点:  
1.修饰器本质上也是一个函数,
2.只不过这个函数接收其他函数作为参数
3.并对其进行一定的改造之后返回新函数

上实例:问:
定义一种方案,能在一个函数执行前输出hello,执行后输出byebye,并统计函数运行的时间?

def sayhello( func ):                  #func参数即为被装饰的对象(这里为a函数)
    def wrapper(*args,**kwargs):       #里面的参数为被装饰对象的参数(这里为:num)
        print("***hello***") 
        return func(*args,**kwargs)    #返回执行a函数
    return wrapper                     #执行 wrapper()函数

def saybye(func):
    def wrapper(*args,**kwargs):
        #又开始执行a函数,但会发现还有一个rate装饰器,于是开始执行rate函数
        func(*args,**kwargs)      
        print("***bye bye***")
    return wrapper

def rate(func):
    def wrapper(*args,**kwargs):
        import datetime
        start=datetime.datetime.now()
        func(*args,**kwargs)   #执行到这,装饰器都调用完了所以开始执行a函数,继续往下
        end=datetime.datetime.now()
        print("***程序运行时间:"+str(end-start))
    return wrapper

@sayhello      #使用 @+装饰器名 的形式给 a函数装饰一个sayhello装饰器,以下一样。
@saybye        #一个函数被装载多个装饰器,按从上到下的顺序执行。
@rate
def a(num):      
    nums=0
    for i in range(num):
        nums+=i
    print(nums) 
a(100000)       #当a函数被调用时,发现有装饰器,先执行装饰器即开始会执行sayhello装饰器

执行过程:
当a函数被调用时,发现a函数上面有三个装饰器:@sayhello ,@saybye ,@rate,于是找到第一个装饰器即sayhello并开始先执行它,此时,sayhello里的func参数即为a函数,执行sayhello函数,会返回一个wrapper对象,然后开始运行wrapper函数,里面的参数即为传入a函数的参数,执行wrapper里的代码后return func(*args,**kwargs),即开始执行a函数,发现a函数上还有装饰器,然后从上往下继续调用装饰器。

运行效果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_39022311/article/details/83476435