如果我用自己的__str__()
函数定义一个类,str(a)
是否相当于a.__str__()
,其中a
是我班级的一个实例?
我检查了python doc,它没有明确说明是这种情况。
简答:是的!
根据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'
是的,它确实。看一下下面的例子:
>>> 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()
调用来计算对象的“非正式”或可打印的字符串表示。返回值必须是字符串对象。
是的,但也有印刷品。请参阅docs https://docs.python.org/2/reference/datamodel.html#object.str