簡而言之:
- __str__ 的目標在於可讀性(對用戶更友好)
- __repr__ 的目標在於無歧義(更有助於調試)
舉個栗子(Difference between str and repr?):
>>> import datetime
>>> today = datetime.datetime.now()
>>> str(today)
'2020-03-28 11:06:49.580643'
>>> repr(today)
'datetime.datetime(2020, 3, 28, 11, 6, 49, 580643)'
注:str()和repr()函數分別調用的是 __str__ 和 __repr__
從上面不難看出, __str__ 強調對於用戶的可讀性,而 __repr__則傾向於描述對象本身。
另外在《流暢的Python》一書中提到如果這兩個方法只實現一個的話,那麼 __repr__ 會是更好的選擇。因爲如果一個對象沒有 __str__ 函數,解釋器會用 __repr__代替,反之則不成立。參考代碼(Difference between str and repr?):
class Sic(object):
def __repr__(object): return 'foo'
print str(Sic())
print repr(Sic())
class Sic(object):
def __str__(object): return 'foo'
print str(Sic())
print repr(Sic())
輸出:
foo
foo
foo
<__main__.Sic object at 0x101ea4810>