比如:
def decorator(func):
..def wrapper():
....print("Do things before foo")
....func()
....print("Do things after foo")
..return wrapper
@Decorator # decorator函数在这里执行,返回wrapper
def foo():
..print("..")
foo() # 这里执行的其实是wrapper
这里出现了3个函数:
decorator是“修饰器”
foo是“被修饰函数”,
wrapper是“修饰函数”
你说的在被修饰函数foo()之前执行的,是这个修饰器decorator,它在def foo时就会执行,你可以简单理解为它的作用就是把foo替换成wrapper。
而你最后一句执行foo()时,此时执行的实际上是用来替换foo的wrapper()。这个wrapper()执行的过程的当中,又会去调用原来的foo()。原来的foo()完成了以后,wrapper还没有结束,这时你可以继续做其他的操作,直到wrapper()也执行完毕。
举个例子。decorator是个装订厂,它先执行一次,在foo这本普通书上订上一些封面,前言,尾声,封底彩页之类的,让它变成一本精装书wrapper。然后你真正开始阅读时(执行函数foo())时,你读的其实是精装书wrapper。你看完foo的正文,还得接着去看wrapper的尾声和彩页才能算是真正读完了这本书。