#该函数将打算作为函数装饰器使用
# 作为函数装饰器使用的函数,必须定义一个形参
def foo(fn):
print('foo 装饰器函数')
print(fn)
# fn就代表了被装饰的
def noname(*args):
print('---在目标函数之前置入的advice----') #AOP
fn(*args) #目标函数依然在此处调用
print('---在目标函数之后置入的advice----') #AOP
return noname
# 被装饰的函数
# test函数会被作为参数传给foo()函数
# test函数被替换成了foo装饰器函数的返回值
@foo
def test(a,b):
print('bar函数')
print('参数a:', a)
print('参数b:', b)
test(2, 4)
# 表面上是调用test函数,实际上是调用foo装饰器函数的返回值noname
# 将被装饰的函数bar作为参数传给装饰器函数foo
# 被装饰的函数bar将被替换成装饰器函数foo的返回值
# print(bar) #bar被装饰成了一种替换成装饰器的返回值:java
# 由于bar其实已经被替换成了‘java’,所以bar函数不能被调用
# bar()
#被装饰的函数作为参数传给装饰器函数,被装饰的函数将被替换成装饰器函数的返回值
本质就是两步,被装饰的函数作为参数传给装饰器函数,被装饰的函数将被替换成装饰器函数的返回值。