Python装饰器原理分析和案例

装饰器部分:

装饰器是可调用的对象,其参数是另一个函数(被装饰的函数)。装饰器可能会处理被装饰的函数,将它返回;或者将其替换成另一个函数或者可调用的对象。

@decorate
def target():
    print('running target()')

以上例子,通过装饰器之后,实际执行的是如下方法:

def target():
     print('running target()')
target = decorate(target)

这两个写法的最终结果是一样的,从第二个例子可以更直观的感受装饰器的效果。将一个函数作为一个参数,输入到另外一个函数中。接下来我们看一个实际的例子。

def demo(func):
    def inner():
        print('runnging the inner()')    
    return inner                       #必须返回函数!!!闭包也是,另外会开一篇讲解闭包   
@demo
def target():
    printing('running the target()')

target =target()
打印结果:running inner()

从上面可以看到,执行的是target()函数,如果没有装饰器的情况下,打印的必然是 running target(),但是在装饰器的作用下,打印了running inner。这个过程其实是把target作为一个参数输入到了demo函数,然后顺序执行了inner函数,而非target函数。

Python 装饰器的第二个特性:导入即执行:我们可以看到,当传入target之后,inner函数实际就执行了。

下面再来看一个例子:

registry  = []
def register(func):
    print('running register(%s)' %func)
    registry.append(func)
    return func
@register
def f1():
    print('running f1()')

@register
def f2():
    print('running f2()')

def f3():
    print('running f3()')

def main():
    f1()
    f2()
    f3()

if __name__ == '__main__':

main()

将该文件作为脚本,import register导入模块,即发现[<running f1 at 0x10061.. running f2 at....],说明了装饰器

在模块导入的时候就能够立即执行,而函数f1,f2(),需要在调用的时候,才能被执行。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值