美文网首页程序员
python 装饰器

python 装饰器

作者: 鸟它鸟 | 来源:发表于2018-04-11 19:57 被阅读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执行的时候通过装饰器的传递拿到了自己的参数,在这个过程中,装饰器可以实现在被装饰的函数执行前和执行后读做一些事情

    相关文章

      网友评论

        本文标题:python 装饰器

        本文链接:https://www.haomeiwen.com/subject/zbbzhftx.html