Python裝飾器小案例分析
Python裝飾器的作用是在不改變原有函式的基礎上,對函式的功能進行增加或者修改。
裝飾器語法是Python語言更加優美且避免很多繁瑣的事情,flask中配置路由的方式便是裝飾器。
首先python中一個函式也是可以當做一個物件進行傳遞的。
def linuxidc(f):
def she():
print("I'm a linuxidc")
return f()
return she
@linuxidc
def linuxmi():
print("I'm a linuxmi")
if __name__ == "__main__":
linuxmi()
輸出結果為
I'm a linuxidc
I'm a linuxmi
上面程式碼相當於
linuxmi = linuxidc(linuxmi)
linuxmi()
帶引數的裝飾器
def change(a):
def linuxidc(f):
def she():
print("I'm a linuxidc")
f()
print("you're not ,you're {} linuxidc".format(a))
return she
return linuxidc
@change("fake")
def linuxmi():
print("I'm a linuxmi")
if __name__ == "__main__":
linuxmi()
結果:
I'm a linuxidc
I'm a linuxmi
you're not ,you're fake linuxidc
相當於
linuxmi = change("fake")(linuxmi)
linuxmi()
其實函式名此時發生了改變
linuxmi.__name__的值為she
解決辦法為使用functools.wraps
import functools
def change(a):
def linuxidc(f):
@functools.wraps(f)
def she():
print("I'm a linuxidc")
f()
print("you're not ,you're {} linuxidc".format(a))
return she
return linuxidc
def linuxmi():
print("I'm a linuxmi")
if __name__ == "__main__":
linuxmi = change("fake")(linuxmi)
linuxmi()
更多Python相關資訊見 Python 專題頁面 https://www.linuxidc.com/topicnews.aspx?tid=17
Linux公社的RSS地址 : https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址: https://www.linuxidc.com/Linux/2019-03/157220.htm