程序员

python 装饰器

2018-04-11  本文已影响0人  鸟它鸟

一直懵逼装饰器到底是个啥东东,先研究了他2种简单的用法,这里分享下。

无参数的装饰器

# coding:utf8

def zhuangshiqi(func):
    print '我是装饰器'
    return func

@zhuangshiqi
def hanshu():
    print '我是一个函数'

写好这段代码后,直接Run一下,发现终端输出了我是装饰器
我们知道在python代码执行的时候会把所有的一级代码加载到内存中去,装饰器的就是在装饰器下放的函数被加载的时候插了个队,让自己被运行一次,之后再加载原本的函数。
注意这里有运行和加载,加载是指没有被调用,当运行脚本的时候要将一级代码加载到内存中(这里指顶头写的函数)
运行,明确要运行某个函数,装饰器装饰到函数上时,只要函数想被加载或者被调用装饰器都会运行一次。
所以可以理解为什么我们定义的hanshu没有被控制执行,但装饰器却被执行了

# coding:utf8

def zhuangshiqi(func):
    print '我是装饰器'
    return func

@zhuangshiqi
def hanshu():
    print '我是一个函数'

hanshu()

修改代码,加上执行hansu的过程,然后运行

我是装饰器
我是一个函数

发现运行的结果多了我是一个函数,且注意是装饰器先运行,函数后运行,所以这里就可以理解为装饰器就是一个特殊的函数,装饰到某个函数之前时,只要这个函数被调用,装饰器就会执行。

有参数的装饰器

def zhuangshiqi(func):
    def exe(*args,**kwargs):
        print 'start zhuangshiqi'
        func(*args,**kwargs)
        print 'stop zhuangshiqi'
    return exe

@zhuangshiqi
def hanshu(a,b=3):
    print(a,b)

写好代码后,同样的Run一下,发现这次啥都没有输出,是说上面说的观点不正确吗?不是的,是由于我们定义的装饰器中没有默认可以执行的项,而装饰器中的exe函数只有在被装饰的hanshu执行时才会被执行到。

def zhuangshiqi(func):
    def exe(*args,**kwargs):
        print 'start zhuangshiqi'
        func(*args,**kwargs)
        print 'stop zhuangshiqi'
    return exe

@zhuangshiqi
def hanshu(a,b=3):
    print(a,b)

hanshu(1,2)

添加上hanshu执行后我们再运行,可以看到结果变了

start zhuangshiqi
(1, 2)
stop zhuangshiqi

相当于,装饰器先拿到了hanshu的参数,装饰器内的函数exe是用来传递hanshu的参数的,在hanshu被运行的时候,装饰器内的exe函数也运行,故输出了start zhuangshiqistop zhuangshiqi,执行的过程中func就是hanshu本身,func执行的时候通过装饰器的传递拿到了自己的参数,在这个过程中,装饰器可以实现在被装饰的函数执行前和执行后读做一些事情

上一篇 下一篇

猜你喜欢

热点阅读