python-装饰器

2023-01-31 02:01:42 python

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

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

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

一 最简单的装饰器:

#!/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关键字,生成器一定是迭代器;


相关文章