Python @函数装饰器及用法(超级详细)
那么,函数装饰器的工作原理是怎样的呢?假设用 funA() 函数装饰器去装饰 funB() 函数,如下所示:
#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 步操作:
将 B 作为参数传给 A() 函数;
将 A() 函数执行完成的返回值反馈回 B。
举个实例:
#funA 作为装饰器函数
def funA(fn):
print("C语言中文网")
fn() # 执行传入的fn参数
print("http://c.biancheng网站站点" rel="nofollow" />
C语言中文网
学习 Pythonhttp://c.biancheng网站站点" rel="nofollow" />
print(funB)
其输出结果为:
装饰器函数的返回值
显然,被“@函数”修饰的函数不再是原来的函数,而是被替换成一个新的东西(取决于装饰器的返回值),即如果装饰器函数的返回值为普通变量,那么被修饰的函数名就变成了变量名;同样,如果装饰器返回的是一个函数的名称,那么被修饰的函数名依然表示一个函数。实际上,所谓函数装饰器,就是通过装饰器函数,在不修改原函数的前提下,来对函数的功能进行理的扩充。
带参数的函数装饰器
在分析 funA() 函数装饰器和 funB() 函数的关系时,细心的读者可能会发现一个问题,即当 funB() 函数无参数时,可以直接将 funB 作为 funA() 的参数传入。但是,如果被修饰的函数本身带有参数,那应该如何传值呢?比较简单的解决方法就是在函数装饰器中嵌套一个函数,该函数带有的参数个数和被装饰器修饰的函数相同。例如:
def funA(fn):
# 定义一个嵌套函数
def say(arc):
print("Python教程:",arc)
return say
@funA
def funB(arc):
print("funB():", a)
funB("http://c.biancheng网站站点" rel="nofollow" />
Python教程: http://c.biancheng网站站点" rel="nofollow" />
def funA(fn):
# 定义一个嵌套函数
def say(arc):
print("Python教程:",arc)
return say
def funB(arc):
print("funB():", a)
funB = funA(funB)
funB("http://c.biancheng网站站点" rel="nofollow" />
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://c.biancheng网站站点" rel="nofollow" />
C语言中文网: http://c.biancheng网站站点" rel="nofollow" /> @funA
@funB
@funC
def fun():
#...
上面程序的执行顺序是里到外,所以它等效于下面这行代码:
fun = funA( funB ( funC (fun) ) )
这里不再给出具体实例,有兴趣的读者可自行编写程序进行测试。
- 随机文章
- 国足 马尔代夫 回放(国足与马尔代夫交锋,重赛结果揭晓!)
- 塞班 马尔代夫 好玩(探索塞班和马尔代夫的乐趣——旅游指南)
- 奥克兰闲马尔代夫(奥克兰市一家闲置公寓仿佛是马尔代夫)
- 太原马尔代夫地址(太原一新开马尔代夫岛屿等你来探索!)
- 在马尔代夫吃泡面(在马尔代夫享用泡面,你准备好了吗?)
- 广元水库马尔代夫(广元水库打造仿马尔代夫风情水上乐园)
- 宜昌马尔代夫现状(宜昌马尔代夫开放复工,游客热情高涨)
- 广州马尔代夫地点(广州一线城市落地最受欢迎岛国项目 )
- 怀孕梦见马尔代夫(怀孕梦中在美丽马尔代夫享受悠闲假期)
- 惠州 马尔代夫(惠州将建马尔代夫主题公园)
- 怀孕 马尔代夫(在马尔代夫备孕的心路历程)
- 新密马尔代夫酒店(新马尔代夫酒店:沉浸式海底奢华体验)
- 横屏马尔代夫视频(惊艳横屏!马尔代夫视频带你虚拟旅行)
- 古城 马尔代夫(重构题目:探索马尔代夫的古城风貌)
- 日落之后马尔代夫(夜晚的马尔代夫:日落之后的奇妙探索)
- 纽约 马尔代夫(纽约中央公园现代化的马尔代夫体验)
- 拖钓 马尔代夫(马尔代夫因拖网捕鱼遭环保团体抨击)
- 泥鳗 马尔代夫(马尔代夫:品尝最新鲜的泥鳗美食)
- 机票直播马尔代夫(直播马尔代夫机票特惠,立享大优惠!)
- 武汉马尔代夫航班(直飞马尔代夫!武汉启动首条国际航线)
- 茂名马尔代夫火车(茂名再添新世界——马尔代夫火车开通)
- 海南马尔代夫美景(探寻海南最美景色:仿若身临马尔代夫)
- 青建马尔代夫项目(青建集团签约打造马尔代夫葛优岛项目)
- 马尔代夫交流协会(马尔代夫设立交流协会以促进国际合作)
- 马尔代夫云南大使(马尔代夫驻云南大使就职仪式隆重举行)
- 瑰丽酒店马尔代夫(探索马尔代夫之旅:神秘瑰丽酒店体验)
- 长岭 马尔代夫(长岭岛:闪耀马尔代夫蓝,探索珊瑚海底世界)
- 马尔代夫介绍小说(纯爱狂热!马尔代夫小说展现热带浪漫)
- 金华马尔代夫廊道(金华打造马尔代夫风情盎然的海岸廊道)
- 国家 马尔代夫(马尔代夫:蓝色海洋和白色沙滩的天堂)
