python` str()`函数是否调用类的__str __()函数?

时间:2016-12-15 16:26:23

标签: python string class

如果我使用自己的__str__()函数定义一个类,str(a)是否等同于a.__str__(),其中a是我班级的一个实例?

我检查了python doc,但没有明确说明情况就是这样。

3 个答案:

答案 0 :(得分:18)

简短回答:是的!

根据Python docs(我强调了相关部分):

  

object.__str__(self)

     

str(object)和内置函数format()和print()调用,以计算对象的“非正式”或可打印的字符串表示形式。返回值必须是字符串对象。

     

此方法与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'

答案 1 :(得分:3)

是的,确实如此。看一下下面的例子:

>>> 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()计算“非正式”或可打印的内容   对象的字符串表示。返回值必须是字符串   对象

答案 2 :(得分:1)

是的,但也有印刷品。查看文档 https://docs.python.org/2/reference/datamodel.html#object.str