首先得强调,python中的引用是无处不在的。
建议先看引文再回来琢磨例子
简单概括装饰器:
对象:
装饰器名字:A
任意函数名字:B
装饰语句:
@A
B()
若执行函数B:
B()
则可理解为:带有@+A的语句可将函数B(被装饰函数)作为参数传入A(装饰器)中,令B指向A返回的引用地址,并执行该地址的函数(因为B后面加了括号,所以是函数调用)
此外,装饰器还可以嵌套使用
下面三个例子是我根据文末引文所改的例子,还参照了上课ppt
主要面向三个问题:多装饰器的执行顺序是咋样的?装饰器里面遇到return 怎么办?函数名与函数调用是一回事吗?
例子就不解释了,看完几乎就大致理解装饰器了。
例1
def before(func):
def wrapper(*args, **kwargs):
print("Before function called!")
func(*args, **kwargs)#call func
return wrapper
def after(func):
def wrapper(*args, **kwargs):
result = func
print("After function called!")
result(*args, **kwargs)#call func
return wrapper
@before
@after
def test():
print("3")
test()
调用test()的输出:
Before function called!
After function called!
3
例2
def before(func):
def wrapper(*args, **kwargs):
print("Before function called!")
func(*args, **kwargs)#call func
return wrapper
def after(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)#call func
print("After function called!")
return result
return wrapper
@before
@after
def test():
print("3")
test()
调用test()的输出:
Before function called!
3
After function called!
例3
def before(func):
def wrapper(*args, **kwargs):
print("Before function called!")
result2 = func(*args, **kwargs) # call func
return result2(*args, **kwargs)
return wrapper
def after(func):
def wrapper(*args, **kwargs):
result = func # call func
print("After function called!")
return result
return wrapper
@before
@after
def test():
print("3")
test()
输出:
Before function called!
After function called!
3
References
解决TypeError: 'NoneType' object is not callable_hardcodetest的博客-CSDN博客_nonetype object