#funA 作为装饰器函数 def funA(fn): #... fn() # 执行传入的fn参数 #... return '...' @funA def funB(): #...
def funA(fn): #... fn() # 执行传入的fn参数 #... return '...' def funB(): #... funB = funA(funB)通过比对以上 2 段程序不难发现,使用函数装饰器 A() 去装饰另一个函数 B(),其底层执行了如下 2 步操作:
#funA 作为装饰器函数 def funA(fn): print("C语言中文网") fn() # 执行传入的fn参数 print("http://task.lmcjl.com") return "装饰器函数的返回值" @funA def funB(): print("学习 Python")程序执行流程为:
C语言中文网
学习 Python
http://task.lmcjl.com
print(funB)其输出结果为:
装饰器函数的返回值
显然,被“@函数”修饰的函数不再是原来的函数,而是被替换成一个新的东西(取决于装饰器的返回值),即如果装饰器函数的返回值为普通变量,那么被修饰的函数名就变成了变量名;同样,如果装饰器返回的是一个函数的名称,那么被修饰的函数名依然表示一个函数。def funA(fn): # 定义一个嵌套函数 def say(arc): print("Python教程:",arc) return say @funA def funB(arc): print("funB():", a) funB("http://task.lmcjl.com/python")程序执行结果为:
Python教程: http://task.lmcjl.com/python
def funA(fn): # 定义一个嵌套函数 def say(arc): print("Python教程:",arc) return say def funB(arc): print("funB():", a) funB = funA(funB) funB("http://task.lmcjl.com/python")如果运行此程序会发现,它的输出结果和上面程序相同。
def funA(fn): # 定义一个嵌套函数 def say(*args,**kwargs): fn(*args,**kwargs) return say @funA def funB(arc): print("C语言中文网:",arc) @funA def other_funB(name,arc): print(name,arc) funB("http://task.lmcjl.com") other_funB("Python教程:","http://task.lmcjl.com/python")运行结果为:
C语言中文网: http://task.lmcjl.com
Python教程: http://task.lmcjl.com/python
@funA @funB @funC def fun(): #...上面程序的执行顺序是里到外,所以它等效于下面这行代码:
fun = funA( funB ( funC (fun) ) )
本文链接:http://task.lmcjl.com/news/7385.html