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

本文深入解析了Python装饰器的概念,展示了如何利用装饰器在不修改原始函数的情况下,增加额外的功能,如添加日志记录、性能监控等。通过具体实例,详细说明了装饰器的工作流程及其在实际开发中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

    装饰器就是对被装饰的对象(函数、类)进行重构的,其可以在不改变原来对象的情况下调用对象时执行重构后的行为
    
特点:  
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函数上还有装饰器,然后从上往下继续调用装饰器。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值