2016-12-15 40 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()计算“非正式”或很好打印 对象的字符串表示形式。返回值必须是字符串 对象。