網站首頁 編程語言 正文
python3 最常用的三種裝飾器語法總結
1.簡述語法
裝飾器也叫函數裝飾器,主要作用是在不修改原來函數的代碼情況下(函數本身不會被修改,執行方式也不變化),增加的一個"裝飾"函數,把原來的函數當成一個整體,像傳參一樣給這個函數使用,并返回這個"函數"。這個過程中我們增加一些函數相關的代碼,當函數被執行的時候,就會一起執行,相當于讓函數增加了更多的功能。
常用的方面:
1.1為函數增加日志記錄功能:許多函數寫的時候,并沒有寫日志記錄功能,通過統一添加日志記錄的裝飾器,就無需更改代碼,從而實現記錄的功能。
1.2為函數實現驗證功能:函數執行的時候,增加驗證是否合規的裝飾器,這是一些安全的措施,有時候非常必要。
1.3補救函數功能:項目結束后,發現重大BUG,可以通過過增加裝飾器的方式修復,大量降低工作量。
2.不帶參數的函數的裝飾器
理解:@符號就是寫一個裝飾器,最基本的裝飾器,就是寫一個函數,并返回一個傳入的參數。本質就是把整個函數當成了參數,并返回,這個過程沒有執行函數,只增加了一個描述信息,如:國家。
def mycountry(m):
country = "china"
print(country)
return m
@mycountry
def myname():
name = "chengruofei"
print(name)
return name
myname()
執行結果:
python myname.py?
china
chengruofei
備注:
把@符號理解成省略了第一步的賦值,會不會豁然開朗:
myname = mycountry(myname)
myname()
3.帶參數的函數的裝飾器
**理解:**只需要在裝飾器函數中,增加一個函數,并且里面一定要組合傳入的“兩個參數”為新的函數,此時返回值就變成了構造的函數。
def mycountry(m):
country = "china"
print(country)
def myb(bb):
m(bb)
print("TEST boy")
return myb
@mycountry
def myname(b):
name = "chengruofei"
print(name)
print("I am a :",b)
return name
myname("boy")
執行結果:
china
chengruofei
('I am a :', 'boy')
TEST boy
備注:
通過裝飾器的函數返回值,就丟失了。
4.帶參數的裝飾器
**理解:**本來裝飾器是沒有參數的,參數是根據函數的定義與否去設定的。但是有時候裝飾器是個復雜的函數,集合了大量的功能,就需要帶入參數去執行合適的裝飾器函數。只需要在原本的解釋器外層加上一層函數,并將中間層函數作為整體返回。
def myID(i):
if i == 'mycountry':
def mycountry(m):
country = "china"
print(country)
def myb(bb):
m(bb)
print("TEST boy")
return myb
return mycountry
else:
def myschool(m):
school = "shijiazhuangjisuanjizhiyejishuxueyuan"
print("I graduated from ",school)
def myb(bb):
m(bb)
print("TEST boy")
return myb
return myschool
@myID('myschool')
def myname(b):
name = "chengruofei"
print(name)
print("I am a :",b)
return name
myname("boy")
執行結果:
('I graduated from ', 'shijiazhuangjisuanjizhiyejishuxueyuan')
chengruofei
('I am a :', 'boy')
TEST boy
原文鏈接:https://blog.csdn.net/ChengRuoFei/article/details/125487186
相關推薦
- 2022-02-14 同一個docker鏡像,如何拉起多個docker container?
- 2022-08-04 python連接FTP服務器的實現方法_python
- 2022-08-04 淺析.net?core?拋異常對性能影響_實用技巧
- 2022-06-09 Linux、ubuntu系統下查看顯卡型號、顯卡信息詳解_Linux
- 2022-04-30 C#繪制實時曲線圖的方法詳解_C#教程
- 2022-06-21 C#實現Array,List,Dictionary相互轉換_C#教程
- 2022-05-15 Python?matplotlib?seaborn繪圖教程詳解_python
- 2022-09-25 CSS-元素隱藏的兩種主要方式
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支