标签:装饰器
一、定义:
是一个传入值是函数,返回值也是函数的高阶函数。
二、作用:
不改变原函数的代码和调用方式,增加新的功能。
三、实例:
把两个函数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 = earth def earth(): print(‘This is earth!‘) @add_func def 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_func def earth(name): # 带参数!!!!!!! print(‘This is %s!‘ % name) print(‘2:‘,earth) earth()
如果多个函数使用同一个装饰器,并且这些函数参数的数量不同,func()可以使用变长形式func(*args, **kwargs)
本文出自 “回首已是空” 博客,请务必保留此出处http://yishi.blog.51cto.com/1059986/1983475
标签:装饰器
原文地址:http://yishi.blog.51cto.com/1059986/1983475