繁体   English   中英

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

[英]Does python `str()` function call `__str__()` function of a class?

如果我用自己的__str__()函数定义一个类, str(a)相当于a.__str__() ,其中a是我的类的实例?

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

简答: 是的!


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

object.__str__(self)

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

此方法与object.__repr__()不同之处在于,没有期望__str__()返回有效的Python表达式:可以使用更方便或简洁的表示。

内置类型对象定义的默认实现调用object.__repr__()

因此,当你执行str(your_instance)时,通常会调用your_instance.__str__


更长的答案:使用“特殊方法”(带有两个前导下划线和两个尾随下划线的方法)有一个例外,因为这些是在类上查找的,而不是实例。 所以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'

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

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

是的,但也有印刷品。 请参阅docs https://docs.python.org/2/reference/datamodel.html#object。 海峡

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM