python之装饰器

什么是装饰器

装饰器是python的一个魔法功能,其本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

实例解释

def w1(func):
    print('----正在装饰1----')
    def wrapper():
        print('---w1---')
        return '<x>' +func() +'<x>'
    return wrapper

def w2(func):
    print('----正在装饰2----')
    def wrapper():
        print('---w2---')
        return '<a>' +func() +'<a>'
    return wrapper

@w1 #等同于foo=w1(foo),但因为下面没有直接的函数,故先不装饰,等下面先装饰
@w2 #等同于 foo = w2(foo),解释器执行到这里时就执行,不需要等调用才执行
def foo():
    print('---w3---')
    return 'mo'

re=foo()
print(re)

上面代码里有三个函数,分别是w1(),w2()和foo(),其中w1()和w2的函数写法应用到了python里面的闭包的概念,简单来说就是给函数对象内部嵌套有子函数,子函数内部才是正在要调用的主函数。通过这种嵌套其实就可以扩展主函数的功能了。
然后foo()函数是被装饰的目标函数,我们可以看到其装饰效果就是直接在函数顶部增加@w1,@w2即进行了装饰,这是一张魔法方法,其实质就是如旁边解释一般,装饰器就是将被装饰目标函数传入装饰器函数内,如w2(foo),然后将foo重新指向w2(foo),即:foo=w2(foo)。这样之后调用foo函数时,其实调用的是被替换的w2(foo)。
那么装饰器是怎么执行,执行时机以及执行顺序,效果是怎么样的,我们看下上述代码输出的效果就知道了。

----正在装饰2----
----正在装饰1----
---w1---
---w2---
---w3---
<x><a>mo<a><x>

可以看到,装饰器装饰的时候,当解释器执行到@w1时,装饰器其实就开始执行了,但因为下面没有函数可装饰,所以装饰器先被暂停,然后执行到@w2,装饰器执行,而且下面有函数可装饰,故执行:foo=w2(foo),可以看到‘’----正在装饰2----‘’先被print。然后@w1发现下面有函数可以装饰,故变成foo=w1(foo),这里的w1传入的foo为foo=w2(foo)左边那个foo,即实际为:foo=w1(w2(foo))。因此可以看到:
‘—正在装饰1----’也被print。之后就开始进入w1内的wrapper(),接下来产出—w1—,然后调用func(),发现func()指向w2的wrapper(),接下来产出—w2—,然后调用func(),发现func()指向foo(),接下来产出—w3—,最后产出mo。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值