python \`str()\` 函数是否调用类的\`__str__()\` 函数?

新手上路,请多包涵

If I define a class with its own __str__() function, is str(a) equivalent to a.__str__() , where a is an instance of my class?

我检查了 python 文档,它没有明确说明是这种情况。

原文由 nos 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 482
2 个回答

简短的回答: 是的!


根据 Python 文档(我突出显示了相关部分):

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__() 。但在大多数情况下,它们是相同的,因为很少有人会在实例上覆盖类的方法。尤其不是特殊方法。

另请参阅 有关“特殊方法查找”的相关文档

对于自定义类,特殊方法的 隐式调用 只有在 对象的类型 上定义时才能保证正确工作,而不是在 对象的实例字典 中。

所以就像 @zzh1996 在评论中指出的那样,即使实例具有自定义可调用 __str__ 属性,以下代码也将使用类上定义的方法:

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

原文由 MSeifert 发布,翻译遵循 CC BY-SA 4.0 许可协议

是的,它确实。看看下面的例子:

 >>> 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__() 文档,我们有:

object.__str__(self)

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

原文由 ettanany 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题