详解python中@的用法
python中@的用法
@是一个装饰器,针对函数,起调用传参的作用。
有修饰和被修饰的区别,作为一个装饰器,用来修饰紧跟着的函数(可以是另一个装饰器,也可以是函数定义)。
代码1
def funa(desa): print("it's funa") def funb(desb): print("it's funb") @funa def func(): print("it's func")
结果1
it's funa
分析1
@funa 修饰函数定义def func(),将func()赋值给funa()的形参。
执行的时候由上而下,先定义funa、funb,然后运行funa(func())。
此时desa=func(),然后funa()输出‘it's funa'。
代码2
def funa(desa): print("it's funa") def funb(desb): print("it's funb") @funb @funa def func(): print("it's func")
结果2
it's funa
it's funb
分析2
@funb 修饰装饰器@funa,@funa 修饰函数定义def func(),将func()赋值给funa()的形参,再将funa(func())赋值给funb()。
执行的时候由上而下,先定义funa、funb,然后运行funb(funa(func()))。
此时desa=func(),然后funa()输出‘it's funa';desb=funa(func()),然后funb()输出‘it's funb'。
代码3
def funa(desa): print("it's funa") print('---') print(desa) desa() print('---') def funb(desb): print("it's funb") @funb @funa def func(): print("it's func")
结果3
it's funa
< function func at 0x000001a5ff763c80 >
it's func
it's funb
分析3
同上,为了更直观地看参数传递,打印desa,其传的是func()的地址,即desa现在为函数desa()。
执行desa()即执行func(),desa=desa()=func()。
代码4
def funa(desa): print("it's funa") def funb(desb): print("it's funb") print('---') print(desb) @funb @funa def func(): print("it's func")
结果4
it's funa
it's funb
none
分析4
上面将func()作为参数传给funa,那么funa(func())怎么传给funb()呢?打印desb,发现并没有参数传递。
是否可以理解为当‘装饰器' 修饰 ‘装饰器'时,仅是调用函数。
以上所述是小编给大家介绍的python中@的用法详解整合,希望对大家有所帮助