如果我定义一个具有自己__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