很多時候我們自己編寫一個類,在將它的實例在終端上列印或查看的時候,我們往往會看到一個不太滿意的結果。所以,我們可能會手動列印對象的一些屬性或者是在類里自己實現一個方法來返回我們需要的信息。 使用__str__方法實現類到字元串的轉化 class Car: def __init__(self, col ...
很多時候我們自己編寫一個類,在將它的實例在終端上列印或查看的時候,我們往往會看到一個不太滿意的結果。所以,我們可能會手動列印對象的一些屬性或者是在類里自己實現一個方法來返回我們需要的信息。
使用__str__方法實現類到字元串的轉化
class Car:
def __init__(self, color):
self.color = color
def __str__(self):
return f'a {self.color} car'
my_car = Car('red')
print(my_car)
my_car
str(my_car)
'{}'.format(my_car)
輸出結果
a red car
<__main__.Car object at 0x000001BEDBDDEC18>
'a red car'
'a red car'
有了 str 這個方法,你就不用手動去列印對象的一些信息或者添加額外的方法去達到目的。類到字元串的轉化使用 str 這種 Pythonic 的方式實現即可。
使用__repr__實現類到字元串的轉化
__repr__的工作方式與__str__類似,但是它被調用的時機不同。
class Car:
def __init__(self, color):
self.color = color
def __str__(self):
return '__str__ for car'
def __repr__(self):
return '__repr__ for car'
my_car = Car('red')
print(my_car)
'{}'.format(my_car)
my_car
輸出結果
__str__ for car
'__str__ for car'
__repr__ for car
從這個操作我們可以看出什麼時候調用str什麼時候調用repr。
另外,列表以及字典等容器總是會使用 repr 方法。即使你顯式的調用 str 方法,也是如此。
__str__和__repr__的差別
import datetime
today = datetime.date.today()
today
str(today)
repr(today)
輸出結果
datetime.date(2020, 4, 22)
'2020-04-22'
'datetime.date(2020, 4, 22)'
因此,我們有個初步的答案。
__str__的返回結果可讀性強。__str__的意義是得到便於人們閱讀的信息。
__repr__的返回結果應更準確。__repr__存在的目的在於調試,便於開發者使用,將__repr__返回的方式直接複製到命令行上,是可以直接執行的。
由上我們可以總結出使用__str__和__repr__方法定義類到字元串的轉化方式,而不需要手動列印某些屬性或是添加額外的方法。__str__的返回結果在於強可讀性,而__repr__的返回結果在於準確性。我們至少需要添加一個__repr__方法來保證類到字元串的自定義轉化的有效性,__str__是可選的。因為預設情況下,在需要卻找不到__str__方法的時候,會自動調用 __repr__方法。