- python中的
装饰器(decorator)
一般采用语法糖的形式,是一种语法格式。比如:@classmethod,@staticmethod,@property,@xxx.setter,@wraps(),@func_name
等都是python中的装饰器。 - 装饰器,装饰的对象是函数或者方法。各种装饰器的作用都是一样的:改变被装饰函数或者方法的功能,性质。
假设用funA()
函数装饰器去装饰funB()
函数,如下所示:
#funA 作为装饰器函数
def funA(fn):
#...
fn() # 执行传入的fn参数
#...
return '...'
@funA
def funB():
#...
实际上,上面程序完全等价于下面的程序:
def funA(fn):
#...
fn() # 执行传入的fn参数
#...
return '...'
def funB():
#...
funB = funA(funB)
通过比对以上 2 段程序不难发现,使用函数装饰器A()
去装饰另一个函数 B()
,其底层执行了如下 2 步操作:
- 将
B
作为参数传给A()
函数; - 将
A()
函数执行完成的返回值反馈回B
。
示例如下:
#funA 作为装饰器函数
def funA(fn):
print("python 学习")
fn() # 执行传入的fn参数
print("http://python.study.net")
return "装饰器函数的返回值"
@funA
def funB():
print("学习 Python")
if __name__ == "__main__":
print(funB)
输出结果:
python 学习
学习 Python
http://python.study.net
装饰器函数的返回值