@ 函数装饰器:起调用传参的作用
例如:
def funA(desA):
print("funA")
def funB(desB):
print("funB")
@funA
def funC():
print("funC")
#结果:
# funA
@funA 修饰函数定义def funC()
将funC()赋值给funA()的形参
编译执行的时候是从上而下
先定义funA,funB,然后运行funA(funC)
此时,desA = funC()
然后funA() 输出“funA”
再例:
def funA(desA):
print("funA")
def funB(desB):
print("funB")
@funB
@funA
def funC():
print("funC")
根据设想
funA(funC()) = funA
funB(funA(funC())) = funB
之所以先输出funA 是因为
funB()的参数是funA修饰器
而在这个修饰器内,会输出funA
执行到@funB的时候会顺次执行funA
有点像递归了一次
再例:
def funA(desA):
print("funA")
print('_______')
print(desA)
desA()
print('_______')
def funB(desB):
print("funB")
@funB
@funA
def funC():
print("funC")
结果
分析一下
funB的参数是funA修饰器
funA修饰器执行
以funC为参数的funA函数
即打印:
funA
desA
funC
funB
打印desA,其传的是funC()的地址
不知道谁是作者,网上一模一样的解释太多了,就没有乱贴作者,不过这个解释我并不满意,只是略微懂了@的用法而已,以后找到满意的解释了再贴上