Python進階-魔術方法(1)


3樓貓 發佈時間:2024-08-13 13:12:27 作者:贏贏贏贏麻 Language

前言

背景

好久沒寫Python了,翻了一下以前的筆記,發現挺陌生哈哈。既然如此,反正暑假比較閒,每天早上打算分享一下自己筆記,順便給自己梳理複習。

目前打算分為魔術方法高級語法,有時間可能會介紹一下設計模式

前排提示:這個系列比較抽象,不適合小白。很少寫文章,如果有語法或者排版錯誤,歡迎d我。


什麼是魔術方法?

根據《流暢的Python》第一章原文:

魔術方法(magic method)是特殊方法的暱稱。當Python解釋器碰到特殊的句法時,會使用特殊方法去激活一些基本的對象操作,這些特殊方法的名字以兩個下劃線開頭,以兩個下劃線結尾(如__getitem__)。當我們使用my_collection[key]去獲得元素的時候,解釋器實際上會調用my_collection.__getitem__(key)。

魔術方法包括以下操作:

  • 迭代

  • 集合類

  • 屬性訪問

  • 運算符重載

  • 函數和方法的調用

  • 對象的創建和銷燬

  • 字符串表示形式和格式化

  • 管理上下文


------分割線------


正文

魔術方法(1):使用__str__與__repr__進行字符串操作


Python中我們經常使用Print來打印一個變量或者說對象,有個經典對話如下

Q:大佬們,我這個程序一直運行不起來,怎麼調試啊?

A:Print一下

但是你有沒有想過,我們打印的背後,到底是如何實現將一個對象轉為方便閱讀的字符串的?

這背後就是__str__與__repr__的功勞了,讓我們編寫一段代碼來展示一下

Python進階-魔術方法(1)-第0張

__str__與__repr__

繼續編寫一個測試

Python進階-魔術方法(1)-第1張

測試

Python進階-魔術方法(1)-第2張

運行結果

區別似乎不明顯?那來看一下官方庫的相關實現吧。datetime是一個內置庫,內部封裝了一些關於時間的操作,比如時間戳轉換,日期轉換,讓我們來調用一下看看他的__str__與__repr__是返回什麼。

Python進階-魔術方法(1)-第3張

官方庫的實現

Python進階-魔術方法(1)-第3張

運行顯示

我們有如下結論,或者說是建議:


  • __str__返回的結果可讀性強,是用來供人閱讀的信息

  • __repr__返回的結果更加準確,目的在於調試,便於開發者使用

有兩點需要額外提示一下

  1. __repr__返回的值在命令行上是可以直接執行的。我們可以打上斷點來在控制檯驗證這一點

  2. 在沒有重載__str__方法的情況下,它內部默認調用的其實是__repr__方法。我們可以刪除__str__重寫,來調用str操作來觀察

Python進階-魔術方法(1)-第3張

 repr會在命令行調用

Python進階-魔術方法(1)-第3張

str默認調用repr實現


© 2022 3樓貓 下載APP 站點地圖 廣告合作:asmrly666@gmail.com