Python中__str__和__repr__的區別
Python有一個內建的函數叫repr,它能把一個對象用字串的形式表達出來以便辨認,這就是“字串表示形式”。repr就是通過__repr__這個特殊方法來得到一個對象的字串表示形式。如果沒有實現__repr__,當我們再控制台裡列印一個變數的執行個體時,得到的字串可能會是<__main__.Object at 0x14af07dbe80>,這個表示的是列印的對象,以及對象的記憶體位址
現在讓我們看看__str__和__repr__這兩個方法有什麼區別
首先定義一個類
class Vector:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def __str__(self):
return 'str Vector(%s, %s)' % (self.x, self.y)
然後我們在控制台上列印這個類的對象執行個體
>>> Vector(1, 2)
<__main__.Vector at 0x14af07dbe80>
>>> str(Vector(1, 2))
'str Vector(1, 2)'
>>> print(Vector(1, 2))
str Vector(1, 2)
從上面的例子我們可以看到,當把變數的執行個體輸入到控制台,會列印出對象的類型和對象的地址,當把對象作為參數傳給str或者print方法,則會調用對象的__str__方法
現在,我們刪除原來的__str__方法,加上__repr__方法,再在控制台做一樣的操作,看看會有什麼不同
class Vector:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def __repr__(self):
return 'repr Vector(%s, %s)' % (self.x, self.y)
重複之前列印Vector對象操作
>>> Vector(1, 2)
repr Vector(1, 2)
>>> str(Vector(1, 2))
'repr Vector(1, 2)'
>>> print(Vector(1, 2))
repr Vector(1, 2)
我們可以看到,實現我們沒有實現__str__方法,但在調用str()的時候,str()會自動調用__repr__方法,並且在控制台輸入對象執行個體的時候,出來的不再是物件類型和記憶體位址,而是列印我們所希望表達的對象資訊
最後,我們在Vector類中加上__str__和__repr__方法
class Vector:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def __str__(self):
return 'str Vector(%s, %s)' % (self.x, self.y)
def __repr__(self):
return 'repr Vector(%s, %s)' % (self.x, self.y)
重複之前的操作
>>> Vector(1, 2)
repr Vector(1, 2)
>>> str(Vector(1, 2))
'str Vector(1, 2)'
>>> print(Vector(1, 2))
str Vector(1, 2)
可以知道,當把對象作為參數傳入print()時,會自動調用對象的__str__方法,但是當__str__方法不存在時,則會調用__repr__方法。所以,如果你只想實現這兩個特殊方法中的一個,建議還是選擇__repr__方法。
本文永久更新連結地址:https://www.bkjia.com/Linux/2018-02/151027.htm