1. 什么是装饰器?
装饰器是一个用来装饰函数的函数。感觉有点拗口,那么,在我的理解,装饰器只是个辅助函数,有没有它并不影响被装饰函数的运行。
2. 函数表达式
先看一下函数表达式,有这样一个函数:
def fun():
print("I am fun")
我们都知道,fun()运行输出:
>> I am fun
然而运行 fun则输出:
>> <function __main__.fun>
所以我们看到函数后加括号就进入了函数内部运行,不加括号只是代表了一个函数对象(Python内部一切皆为对象),记住这一点后面容易理解装饰器。
3. 场景
现在有一堆函数:
def fun1():
print("I am fun1")
def fun2():
print("I am fun2")
def fun3():
print("I am fun3")
为了证明这些函数是我写的,所有的函数后面都要打印一句话:
def fun1():
print("I am fun1")
print("author is kang")
但是所以的函数都加这句话似乎太麻烦了。这个时候尅考虑使用闭包来实现。
4. 闭包实现
改成闭包的实现形式:
def show_author(fun):
def warpper():
fun()
print("author is kang")
return warpper
fun1=show_author(fun1)
注意到运行fun1=show_author(fun1)这段代码fun1并没有被执行,只是生成了一个新的函数,这个函数等价于第3节最后的函数。
5. 用装饰器简化
以上需求的实现还是有一点繁琐,Python大发给我们提供了@语法糖,来看一下怎么使用:
@show_author
def fun1():
print("I am fun1")
运行fun1的结果和第3节最后的函数也是一致的。
如程序所示,@shoe_me和原来闭包实现fun1 = show_author(func1)是完全等价的,这样便能在不改变原函数的情况下添加装饰,增加功能。