2016-12-15 45 views
1

如果我定義一個具有自己__str__()函數的類,是str(a)等效於a.__str__(),其中a是我的類的一個實例嗎?python`str()`函數是否調用類的__str __()`函數?

我查了python doc,它沒有明確說明是這種情況。

+0

爲什麼不自己嘗試一下呢? –

+1

你爲什麼不測試它?創建一個新類,並覆蓋'__str__'方法。 – Carcigenicate

+1

請參閱[str doc](https://docs.python.org/3/library/stdtypes.html#str) – tdelaney

回答

10

簡短回答:是的!


按照Python docs(我強調的相關部分):

object.__str__(self)

STR(對象)和內置函數格式()調用和打印()來計算一個對象的「非正式」或很好的可打印字符串表示形式。返回值必須是一個字符串對象。

該方法不同於object.__repr__(),因爲__str__()沒有預期返回有效的Python表達式:可以使用更方便或簡潔的表示法。

由內置類型對象定義的默認實現調用object.__repr__()

所以your_instance.__str__通常會在您做str(your_instance)時調用。


較長的答案:用「特殊方法」(以兩個前導下劃線和兩個尾隨下劃線的方法)有一個例外,因爲這些都是擡頭的類,而不是實例。所以str(a)實際上是type(a).__str__(a)而不是a.__str__()。但在大多數情況下,這些都是相同的,因爲很少會覆蓋實例上類的方法。尤其不是特別的方法。

relevant documentation on "Special method lookup"請參見:

對於定製類,特殊方法隱含調用只能保證,如果在一個對象的類型定義,而不是在對象的實例字典才能正常工作。

所以,像@ zzh1996在評論中指出下面的代碼將使用即使實例有一個自定義調用__str__屬性類中定義的方法:

>>> class A(object): 
...  def __str__(self): 
...   return 'a' 
>>> instance = A() 
>>> instance.__str__ = lambda: 'b' 
>>> str(instance) 
'a' 
>>> instance.__str__() 
'b' 
+0

這是錯誤的! ''' 在[21]:A類: ...:DEF __str __(個體): ...:返回 'A' ...: ...: 在[22]: A = A() 在[23]的:def f()的: ...:返回 'b' ...: 在[24]:一個.__ STR __ = F 在[25]: STR(一) 出[25]: 'A' ''' – zzh1996

+0

@ zzh1996是的,特殊的方法是擡起頭來的類,而不是實例。然而,我認爲這會分散詢問「'str()'函數調用'__str __()'函數的實際問題嗎?」 (這種情況),但是'str(a)'並不總是等同於'a .__ str __()',而是'type(a).__ str __(a)'。但我在這一點上進一步澄清。 – MSeifert

2

是的,它的確如此。在下面的例子看看:

>>> class A: 
...  def __init__(self, a): 
...   self.a = a 
...  def __str__(self): 
...   print "Inside __str__" 
...   return self.a 
... 
>>> 
>>> a = A('obj1') 
>>> a 
<__main__.A instance at 0x0000000002605548> 
>>> 
>>> a.__str__() 
Inside __str__ 
'obj1' 
>>> 
>>> str(a) 
Inside __str__ 
'obj1' 

而且,從__str__() documentation,我們有:

object.__str__(self)

通過str(object)調用和內置功能 format()print()計算「非正式」或很好打印 對象的字符串表示形式。返回值必須是字符串 對象。