一、__str__
方法
__str__
方法用于定義對象的“用戶友好”字符串表示形式。它通常在使用print()
函數或str()
函數時被調用,目的是為了讓對象的輸出更易讀,更符合人類閱讀習慣。
如果一個對象沒有定義__str__
方法,而又嘗試使用print()
函數打印該對象,Python會調用對象的__repr__
方法作為備選方案來提供字符串表示形式。
__str__
方法應該返回一個字符串類型的值,可以直接被打印輸出。
二、__repr__
方法
__repr__
方法用于定義對象的“開發者友好”字符串表示形式。它通常在交互式環境下(如Python解釋器)被調用,或者使用repr()
函數時也會被調用。
__repr__
方法的目的是為了給出對象的詳細信息,方便開發者調試和了解對象的內部結構。
如果一個對象沒有定義__repr__
方法,Python會使用默認的__repr__
實現,該實現會返回一個包含對象類型和內存地址的字符串。
三、區別與適用場景
__str__
適合用于提供用戶友好的輸出,通常應該返回一個易讀的字符串,便于展示給最終用戶。
__repr__
適合用于提供開發者友好的輸出,通常應該返回一個詳細的字符串,便于開發者理解對象的內部結構和狀態。
如果兩個方法都被定義,__str__
會覆蓋__repr__
,并在使用print()
函數時優先調用。
如果只定義了__repr__
而沒有定義__str__
,那么在使用print()
函數時會調用__repr__
。
下面是一個示例代碼,演示了__str__
和__repr__
方法的區別:
class Point: def __init__(self, x, y): self.x = x self.y = y def __str__(self): return f'Point({self.x}, {self.y})' def __repr__(self): return f'Point(x={self.x}, y={self.y})'p = Point(1, 2)print(p) # 輸出: Point(1, 2)print(str(p)) # 輸出: Point(1, 2)print(repr(p)) # 輸出: Point(x=1, y=2)
延伸閱讀
Python中的格式化字符串
除了在__str__
和__repr__
方法中自定義對象的字符串表示形式,Python還提供了格式化字符串的功能,以更靈活地控制輸出結果。格式化字符串使用花括號 {}
作為占位符,可以在其中插入變量、表達式或對象的屬性。
在Python 3.6及以上版本中,引入了f-string(格式化字符串字面值)的特性,它允許在字符串前添加 f
或 F
,然后在字符串中使用花括號插入表達式。f-string非常方便,可以在字符串中直接引用變量,使得代碼更簡潔易讀。
示例代碼:
name = "Alice"age = 30print(f"My name is {name} and I am {age} years old.")
除了f-string,Python還支持str.format()
方法和舊式的%
格式化方法,它們提供了更多的靈活性和兼容性。格式化字符串的選擇取決于個人偏好和項目要求,可以根據具體情況選擇非常適合的方式來格式化字符串。