前言
背景
好久沒寫Python了,翻了一下以前的筆記,發現挺陌生哈哈。既然如此,反正暑假比較閒,每天早上打算分享一下自己筆記,順便給自己梳理複習。
目前打算分為魔術方法和高級語法,有時間可能會介紹一下設計模式
前排提示:這個系列比較抽象,不適合小白。很少寫文章,如果有語法或者排版錯誤,歡迎d我。
什麼是魔術方法?
根據《流暢的Python》第一章原文:
魔術方法(magic method)是特殊方法的暱稱。當Python解釋器碰到特殊的句法時,會使用特殊方法去激活一些基本的對象操作,這些特殊方法的名字以兩個下劃線開頭,以兩個下劃線結尾(如__getitem__)。當我們使用my_collection[key]去獲得元素的時候,解釋器實際上會調用my_collection.__getitem__(key)。
魔術方法包括以下操作:
迭代
集合類
屬性訪問
運算符重載
函數和方法的調用
對象的創建和銷燬
字符串表示形式和格式化
管理上下文
------分割線------
正文
魔術方法(1):使用__str__與__repr__進行字符串操作
Python中我們經常使用Print來打印一個變量或者說對象,有個經典對話如下
Q:大佬們,我這個程序一直運行不起來,怎麼調試啊?
A:Print一下
但是你有沒有想過,我們打印的背後,到底是如何實現將一個對象轉為方便閱讀的字符串的?
這背後就是__str__與__repr__的功勞了,讓我們編寫一段代碼來展示一下
__str__與__repr__
繼續編寫一個測試
測試
運行結果
區別似乎不明顯?那來看一下官方庫的相關實現吧。datetime是一個內置庫,內部封裝了一些關於時間的操作,比如時間戳轉換,日期轉換,讓我們來調用一下看看他的__str__與__repr__是返回什麼。
官方庫的實現
運行顯示
我們有如下結論,或者說是建議:
__str__返回的結果可讀性強,是用來供人閱讀的信息
__repr__返回的結果更加準確,目的在於調試,便於開發者使用
有兩點需要額外提示一下
__repr__返回的值在命令行上是可以直接執行的。我們可以打上斷點來在控制檯驗證這一點
在沒有重載__str__方法的情況下,它內部默認調用的其實是__repr__方法。我們可以刪除__str__重寫,來調用str操作來觀察