装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能.
装饰器的作用就是为已经存在的对象添加额外的功能。
def funA(fun): print (fun()) def funB(): print ('B') return 1 funA(funB) ----------------------------- >>> B 1
可以看出,这个程序的运行过程为:
1.执行函数funB,输出了一个B,另外返回了一个值:1
2.执行函数funA,把funB返回的值1给输出了出来
而修饰器的作用:
def funA(fun): #函数本身也是对象,所以可以将函数作为参数传入另一函数并进行调用,而funB是有返回值的,所以结果输出了返回值1.(个人理解) print (fun()) @funA def funB(): print ('B') return 1 ---------------------- >>> B 1
作用相当于 funA(funB),不过只能放在一个函数或者类定义之前
需要注意的是,如果funB在funA里没用被调用的话,那funB是不会被执行的,如:
def funA(fun): print ('funA') @funA def funB(): print ('B') return 1 --------------------------- >>> funA
可以看出,只执行了funA而funB没有被执行,因为print('B')并没有被打印出来.
ps:如果funA不加参数的话,比如直接 def funA(): 这样定义,他是会报错的:
@funA TypeError: funA() takes 0 positional arguments but 1 was given
大意是@funA中的funA必须要给他提供一个参数,但是你给了0个.