Python中的魔法方法__repr__和__str__用法實例詳解
引言
當我們直接打印一個python類對象時,得到的通常是類似“<main.ClassName object at 0xmemory_address>”這樣一段字符,無法獲得對象的具體狀態(tài)。這個時候我們就可以重新定義/重寫對應類的魔術方法__repr__
和__str__
,使得我們在打印對象時能夠獲得對象的當前狀態(tài)信息。
1、__repr__方法
1.1 含義及作用
在Python中,__repr__
方法是一種特殊的方法,全稱為 “representation”,即“表示”或“表達”。這個方法用于返回一個對象的“官方”字符串表示形式,主要用于調(diào)試和開發(fā)目的,使得開發(fā)者可以清楚地看到對象的狀態(tài)。
1.2 示例
下面是一個簡單的例子,來說明__repr__
的使用方法:
class Point: def __init__(self, x, y): self.x = x self.y = y def __repr__(self): return f'Point(x={self.x}, y={self.y})' p = Point(1, 2) # 這個例子中定義了`__repr__`方法 # 輸出: Point(x=1, y=2) print(p) # 如果沒有定義`__repr__`方法, # 輸出可能為:<__main__.Point object at 0x7fecf006e978>
在這個例子中,Point類定義了一個__repr__
方法,當對象p被打印時,就會輸出Point(x=1, y=2),這樣就清楚的展示了點的位置信息。
2、__str__方法
2.1 含義及作用
在Python中,__str__
方法也是一種特殊的方法(也稱為魔術方法),它定義了如何對對象轉(zhuǎn)換為用戶友好的字符串表示形式。當對象被打印(傳遞給print()函數(shù))或者被轉(zhuǎn)換成字符串類型時(比如使用str(obj)),Python解釋器會嘗試調(diào)用該對象的__str__
方法。
__str__
方法為對象提供了一個簡潔、易讀的字符串表示,對用戶十分友好,以便于開發(fā)者和終端用戶了解對象的實時狀態(tài),通常用于調(diào)試和日志記錄。
2.2 示例
下面是一個簡單的示例,展示了如何定義__str__
方法來描述一個Person類的對象:
class Person: def __init__(self, name, age): self.name = name self.age = age def __str__(self): return f"{self.name} is {self.age} years old." # 創(chuàng)建一個Person實例 john = Person('John Doe', 30) # 打印這個Person實例 print(john) # 輸出: John Doe is 30 years old. # 將對象轉(zhuǎn)換為字符串 person_str = str(john) print(person_str) # 輸出: John Doe is 30 years old.
在這個例子中,__str__
方法返回了一個格式化的字符串,描述了 Person
對象的名字和年齡。當我們將 john
對象打印或轉(zhuǎn)換為字符串時,__str__
方法就會被自動調(diào)用,從而返回我們定義的描述性字符串。
如果一個類沒有定義__str__
方法,Python解釋器會調(diào)用內(nèi)置的__repr__
方法來獲取對象的字符串表示。如果也沒有定義__repr__
方法,Python解釋器會使用默認的字符串表示形式,即返回對象在計算機內(nèi)存中的實際地址。
3、兩種方法的對比
兩種方法均由兩個下劃線開頭和結尾,這樣的命名方式是 Python 用來標識特殊方法的一種約定。
__repr__
(representation):主要目的是為解釋器和開發(fā)者提供對象的詳細信息,它應該返回一個包含創(chuàng)建此對象所需的所有信息的字符串,理想情況下,該字符串可以用python代碼重新創(chuàng)建對象。
__str__
(stringification):主要目的是為對象提供人性化的字符串表示,便于開發(fā)者和用戶理解對象的狀態(tài),它的結果應該簡潔直觀,易于閱讀。
下面舉個例子進一步說明兩者的不同:
class Person: def __init__(self, name, age): self.name = name self.age = age def __repr__(self): # 返回一個可以直接被eval()執(zhí)行的字符串 return f"Person('{self.name}', {self.age})" def __str__(self): return f"{self.name} is {self.age} years old." # 創(chuàng)建一個Person實例 john = Person('John Doe', 30) # 使用repr函數(shù)顯示對象的官方字符串表示 print(repr(john)) # 輸出: Person('John Doe', 30) # 使用eval()函數(shù)根據(jù)`__repr__`提供的字符串重新創(chuàng)建對象 new_john = eval(repr(john)) # 檢查新對象是否與原對象具有相同的屬性值 print(new_john) # 輸出: John Doe is 30 years old. print(new_john.name, new_john.age) # 輸出: John Doe 30
在這個例子中,__repr__方法提供了一個可以用來重新創(chuàng)建Person對象的字符串,該字符串可以通過eval()函數(shù)來執(zhí)行,從而創(chuàng)建一個新的Person實例。而__str__
方法則為Person對象提供了一種人性化的描述。
總的來說,__repr__
方法的目的是盡可能準確地表示對象的狀態(tài),以便于開發(fā)人員準確了解對象的內(nèi)部數(shù)據(jù)。與之相對,__str__
方法則偏向于面向用戶的友好展示。在實際編程中,推薦同時定義這兩個方法,以確保對象在所有的上下文中都能得到合適的字符串表示。
區(qū)別小結:
__repr__和__str__這兩個方法都是用于顯示的,__str__是面向用戶的,而__repr__面向程序員。
打印操作會首先嘗試__str__和str內(nèi)置函數(shù)(print運行的內(nèi)部等價形式),它通常應該返回一個友好的顯示。
__repr__用于所有其他的環(huán)境中:用于交互模式下提示回應以及repr函數(shù),如果沒有使用__str__,會使用print和str。它通常應該返回一個編碼字符串,可以用來重新創(chuàng)建對象,或者給開發(fā)者詳細的顯示。
當我們想所有環(huán)境下都統(tǒng)一顯示的話,可以重構__repr__方法;當我們想在不同環(huán)境下支持不同的顯示,例如終端用戶顯示使用__str__,而程序員在開發(fā)期間則使用底層的__repr__來顯示,實際上__str__只是覆蓋了__repr__以得到更友好的用戶顯示。
總結
到此這篇關于Python中魔法方法__repr__和__str__用法的文章就介紹到這了,更多相關Python魔法方法__repr__和__str__內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python RobotFramework的安裝過程及應用實戰(zhàn)教程
這篇文章主要介紹了RobotFramework的安裝過程及應用實戰(zhàn)教程,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08關于python3.7安裝matplotlib始終無法成功的問題的解決
這篇文章主要介紹了關于python3.7安裝matplotlib始終無法成功的問題的解決,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07解決Pycharm調(diào)用Turtle時 窗口一閃而過的問題
今天小編就為大家分享一篇解決Pycharm調(diào)用Turtle時 窗口一閃而過的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02