定义装饰器
装饰器可以用在方法上, 也可以用在类上.
目前我们只研究方法装饰器
其实装饰器和 java 中的注解有点像, 但是比 java 的注解容易使用了很多.
如果我们要给函数foo
使用装饰器的方式增强功能, 语法如下:
@strong
def hello():
print("我是 hello 函数中的代码")
说明:
在需要添加的装饰函数上面一行使用
@
来添加装饰器@
后面紧跟中装饰器名strong
, 当然你可以定于任何的名字.strong
是装饰器, 本质上是一个函数. 他接收函数hello
作为参数, 并返回一函数来替换掉hello
(当然也可以不替换).hello
使用装饰器之后, 相当于hello
函数使用下面的代码被替换掉了.hello = strong(hello)
在调用
hello
的时候, 其实是调用的strong()
返回的那个函数.
def strong(fun): # fun 将来就是被替换的 hello
def new_hello():
print("我是装饰器中的代码, 在 hello 之前执行的")
fun()
print("我是装饰器中的代码, 在 hello 之后...执行的")
return new_hello
@strong
def hello():
print("我是 hello 函数中的代码")
# 这里调用的其实是装饰器返回的函数.
hello()
装饰器是语法糖
严格来讲, 装饰器只是语法糖.
装饰器就是一函数, 其参数是被装饰的函数.
综上, 装饰器的一大特性就是把装饰的函数替换成其他函数, 第二大特性就是装饰函数在加载模块的时候就立即执行了.