装饰器的提出:
给定一个函数,要求输出10个‘+’:
def yuu():
for i in range(10):
print('+')
若要求yuu函数不变,先打印10个‘x’再打印10个'+':
def outer(func):
def ack():
for i in range(10):
print('x')
print()
func()
return ack
def yuu():
for i in range(10):
print('+')
f = outer(yuu)
f()
可以看到,outer函数中嵌套了一个ack函数,并以ack函数为返回值,yuu函数作为outer函数的形参传入函数中。f接收了返回值,则f相当于ack函数,再调用f得到预期的值。
结果如下:
装饰器是为了修饰函数所用,在不改变原函数代码的情况下,为原有的函数添加新的特性。
较复杂的装饰器:
def outer(func):
def cage(age):
if age<0:
print('年龄错误!')
else :
func(age)
return cage #返回一个函数
@outer #say = outer(say)
def say(age):
print('年龄为%d岁'%(age))
say(-9)
在这里我们相当于将原来的say函数覆盖了,say = outer(say)中,outer函数的返回值是cage函数,再将cage函数赋给say函数,相当于给say函数增加了一个判断的功能。(@outer等价于say = outer(say))
我们可以看到,当say函数的参数为-9时,输出并不为‘年龄为-9岁’,而是‘年龄错误!’: