一、定义:
是一个传入值是函数,返回值也是函数的高阶函数。
二、作用:
不改变原函数的代码和调用方式,增加新的功能。
三、实例:
把两个函数earth()和moon()添加print('They are in the solar system!')
1、定义两个函数,分别有自己的功能:
def earth(): print('This is earth!')
def moon():
print('This is moon!')
earth()
moon()
运行结果:
This is earth!This is moon!
2、在不改变当前函数代码,和调用方式情况下,加一个打印太阳系的功能。
def add_func(func): # func是一个函数体,func()是运行函数 def solar(): print('It is in the solar system!') func() return solar # 返回solar函数,earth = solar@add_func # 此句功能func = earthdef earth(): print('This is earth!') @add_funcdef moon(): print('This is moon!')earth()moon()
运行结果:
It is in the solar system!This is earth!It is in the solar system!This is moon!
每次调用earth()和moon(),都会增加打印It is in the solar system!这句。
原理:
和交换a,b值原理是一样的,首先,把earth函数地址保存到func,再把solar的地址保存到earth,这时候然后再调用earth,实际运行的是solar,再在solar里调用func,实现原来的功能。
函数,例如earth(),不带括号,可以理解成变量名; 带括号,运行函数,返回函数运行结果。
3、如果原函数带参数,最里面的func()也需要带参数。
name = 'earth'def add_func(func): def solar(): print('It is in the solar system!') func(name) # 带参数!!!!!!! print('1:',solar) return solar@add_funcdef earth(name): # 带参数!!!!!!! print('This is %s!' % name)print('2:',earth)earth()
如果多个函数使用同一个装饰器,并且这些函数参数的数量不同,func()可以使用变长形式func(*args, **kwargs)
本文出自 “回首已是空” 博客,请务必保留此出处http://yishi.blog.51cto.com/1059986/1983475