本文為 python 物件導向系列文:第三篇
- 深入理解 Python 中的 self 與物件導向原理
- 初學者指南:深入了解 Python 的 init 方法
- 理解 Python 中的 str 與 repr 方法 👈所在位置
- 初學者指南:深入了解 Python 繼承
- 初學者指南:深入了解 Python 方法覆寫與 super()
- 初學者指南:深入了解 Python 中的多重繼承與鑽石問題
在 Python 中,物件本身的字串表示通常用於調試、日誌記錄或向使用者展示物件資訊。
為了讓物件的輸出更加可讀和有意義,Python 提供了兩個魔術方法:__str__ 和 __repr__。
這兩者有著不同的用途,但初學者往往容易混淆它們的差異與應用場景。
本文將通過範例詳細講解這兩個方法的作用與原理,幫助你更好地理解和使用它們。
前言
當我們打印一個物件時,若該物件未定義特定的顯示方法,Python 會輸出該物件的記憶體位置資訊。例如:
class Cat:
pass
kitty = Cat()
print(kitty)輸出類似以下結果:
<__main__.Cat object at 0x7f8b7c3f5ac0>這樣的輸出對開發者或使用者來說幾乎沒有任何資訊。
因此,我們可以通過覆寫 __str__ 和 __repr__ 方法,來讓物件的輸出更有意義。
基本使用範例
以下是添加 __str__ 和 __repr__ 方法的例子:
class Cat:
def __init__(self, name):
self.name = name
def __str__(self):
return f"str = {self.name}"
def __repr__(self):
return f"repr = {self.name}"
kitty = Cat('安安')
print(kitty)輸出:
str = 安安方法解析
__str__- 用於定義物件的「可讀字串表示」,通常是給使用者看的。
- 當使用
print()函數或str(obj)時,會調用此方法。
__repr__- 用於定義物件的「正式字串表示」,通常是給開發者看的,應該提供物件的詳細資訊。
- 當在交互式解釋器中直接輸入物件名稱時,或使用
repr(obj)時,會調用此方法。
當只定義 __repr__ 時的行為
如果我們註解掉 __str__ 方法,只保留 __repr__:
class Cat:
def __init__(self, name):
self.name = name
def __repr__(self):
return f"repr = {self.name}"
kitty = Cat('安安')
print(kitty)輸出:
repr = 安安行為解釋
- 如果物件同時定義了
__str__和__repr__,則print(obj)會優先使用__str__。 - 如果物件只定義了
__repr__,則print(obj)和repr(obj)都會使用__repr__。
這是因為 Python 預設使用 __repr__ 作為物件的基本表示方法,__str__ 只是一個額外的覆寫選項,用於更友好的輸出。
__str__ 與 __repr__ 的差異與應用場景
| 特性 | __str__ | __repr__ |
|---|---|---|
| 用途 | 提供易於閱讀的物件描述,供使用者查看 | 提供正式且詳細的物件描述,供開發者調試使用 |
| 優先級 | print(obj) 或 str(obj) 使用 | 交互式解釋器或 repr(obj) 使用 |
| 預設行為 | 若未定義,默認調用 __repr__ | 若未定義,顯示物件的記憶體位址資訊 |
| 內容建議 | 簡短且易懂的描述 | 精確的資訊,儘可能重現物件的初始化狀態 |
__str__提供易於閱讀的物件描述,供使用者查看
__repr__提供正式且詳細的物件描述,供開發者調試使用
__str__print(obj) 或 str(obj) 使用
__repr__交互式解釋器或 repr(obj) 使用
__str__若未定義,默認調用 __repr__
__repr__若未定義,顯示物件的記憶體位址資訊
__str__簡短且易懂的描述
__repr__精確的資訊,儘可能重現物件的初始化狀態
原理與實現細節
為什麼 __str__ 和 __repr__ 都存在?
- 不同的目標對象:
__str__面向使用者,提供簡明易懂的資訊;__repr__面向開發者,提供詳細的技術資訊。 - 重複使用的便利性:
當未定義__str__時,Python 會自動回退使用__repr__,避免重複定義的麻煩。
建議與最佳實踐
- 同時定義
__str__和__repr__- 若物件既需要對使用者友好的輸出,又需要給開發者詳細的資訊,應該同時定義兩者,並區分其內容。
- 讓
__repr__重現物件的初始化狀態__repr__的返回值應包含足夠的資訊,以便通過執行此字串重新創建相同的物件。
- 簡化
__str__的內容__str__應盡量簡短,避免將技術細節暴露給使用者。
總結
Python 的 __str__ 和 __repr__ 方法是自定義物件字串表示的關鍵工具。
它們分別用於滿足使用者和開發者的不同需求,讓物件的輸出既友好又實用。
通過合理使用這兩個方法,我們可以讓代碼的可讀性與可調試性大幅提升,是物件導向編程中不可忽略的重要技術點。
學會正確區分與使用 __str__ 和 __repr__,將讓你的 Python 編程更加精確和高效!