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关键字,生成器一定是迭代器;
相关文章