python-装饰器

发布时间:2019-08-26 07:19:24编辑:auto阅读(1602)

    装饰器简介:给被装饰的函数在不更改代码的基础上增加新的功能;

    多个装饰器的执行顺序:从最靠近原始函数的装饰器开始执行,最后执行原始函数; 

    直接上个简单的例子就懂了: 

    一 最简单的装饰器:

    #!/usr/bin/python 

    def deco(func1):

        print("111")

        def one():

            print("222")

            func1()

        return one


    @deco

    def myinit():

        print("init")


    myinit()


    原始函数myinit,作用输出init;

    装饰器函数deco,用一个函数func1作为参数,内部定义一个函数one,最后return one,形成闭包;

    执行顺序:先执行装饰器函数deco外部的print("111"),再执行deco内部的print("222"),最后执行原始函数myinit;

    结果为:

    111

    222

    init



    二 多个装饰器:

    #!/usr/bin/python 

    def deco(func1):

        print("111")

        def one():

            print("222")

            func1()

        return one


    def deco2(func2):

        print("aaa")

        def two():

            print("bbb")

            func2()

        return two


    @deco

    @deco2

    def myinit():

        print("init")


    myinit()

    原始函数myinit,作用输出init;

    装饰器函数deco,用一个函数func1作为参数,内部定义一个函数one,最后return one,形成闭包;

    装饰器函数deco2,用一个函数func2作为参数,内部定义一个函数two,最后return two,形成闭包;

    执行顺序:先执行装饰器函数deco2外部的print("aaa"),再执行装饰器函数deco外部的print("111"),接着解释器向下执行deco内部的print("222"),然后执行deco2内部的print("bbb"),最后执行原始函数myinit;

    结果为:

    aaa

    111

    222

    bbb

    init



    三 带有不定参数的装饰器

    #!/usr/bin/python 

    def deco(func1):

        print("111")

        def one(*args, **kwargs):

            print("222")

            func1(*args, **kwargs)

        return one


    @deco

    def myinit(a,b,c):

        print("sum is %d" % (a+b+c))


    myinit(1,2,3)


    结果为:

    111

    222

    sum is 6


    顺便赠送两个概念:

    迭代器:带状态的对象; 能在你调用next()方法的时候返回容器中下一个值,任何实现了__iter__和__next__()方法的对象都是迭代器,__iter__返回迭代器自身,__next__返回容器中的下一个值,如果容器中没有更多元素了,则抛出StopIteration异常;

    生成器: 特殊的迭代器,更加优雅的实现,不需要通过__iter__()和__next__()方法,只需要一个yiled关键字,生成器一定是迭代器;


关键字