如果我定義一個具有自己__str__()
函數的類,是str(a)
等效於a.__str__()
,其中a
是我的類的一個實例嗎?python`str()`函數是否調用類的__str __()`函數?
我查了python doc,它沒有明確說明是這種情況。
如果我定義一個具有自己__str__()
函數的類,是str(a)
等效於a.__str__()
,其中a
是我的類的一個實例嗎?python`str()`函數是否調用類的__str __()`函數?
我查了python doc,它沒有明確說明是這種情況。
簡短回答:是的!
按照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'
這是錯誤的! ''' 在[21]:A類: ...:DEF __str __(個體): ...:返回 'A' ...: ...: 在[22]: A = A() 在[23]的:def f()的: ...:返回 'b' ...: 在[24]:一個.__ STR __ = F 在[25]: STR(一) 出[25]: 'A' ''' – zzh1996
@ zzh1996是的,特殊的方法是擡起頭來的類,而不是實例。然而,我認爲這會分散詢問「'str()'函數調用'__str __()'函數的實際問題嗎?」 (這種情況),但是'str(a)'並不總是等同於'a .__ str __()',而是'type(a).__ str __(a)'。但我在這一點上進一步澄清。 – MSeifert
是的,它的確如此。在下面的例子看看:
>>> 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()
計算「非正式」或很好打印 對象的字符串表示形式。返回值必須是字符串 對象。
爲什麼不自己嘗試一下呢? –
你爲什麼不測試它?創建一個新類,並覆蓋'__str__'方法。 – Carcigenicate
請參閱[str doc](https://docs.python.org/3/library/stdtypes.html#str) – tdelaney