详细见:http://python.jobbole.com/86632/
python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的指针)。装饰器函数的外部函数传入我要装饰的函数名字,返回经过修饰后函数的名字;内层函数(闭包)负责修饰被修饰函数。从上面这段描述中我们需要记住装饰器的几点属性,以便后面能更好的理解:
实质: 是一个函数
参数:是你要装饰的函数名(并非函数调用)
返回:是装饰完的函数名(也非函数调用)
作用:为已经存在的对象添加额外的功能
特点:不需要对对象做任何的代码上的变动
def w1(func): def inner(): print('1') return func() return inner @w1(语法糖) def f1(): print("2") return 3 a=f1() print(a)
输出:
1
2
3
总结:装饰器比较符合设计模式的开闭原则,即修改关闭、扩展开放,在原有代码不改变的情况,扩展新的功能。上面在执行f1之前先打印出1,就是类似于加了新功能,而最终的返回值还是函数f1的返回值3,也就是a=3。其实f1执行就在里面的那句话return func(),既执行了函数f1函数体,返回值也是f1的返回值。做一个修改如下:
def w1(func): def inner(): print('1') return 5 return inner @w1 def f1(): print("2") return 3 a=f1() print(a)
输出:
1
5
为什么返回1,5?就是因为在装饰器里面没有执行f1的语句,所以就没有f1的任何语句执行。