__repr__ vs __str__
看下面例子:
>>> class Spam():
... def __init__(self, name = 'Bob'):
... self.name = name
>>> S = Spam()
>>> s
<__main__.Spam object at 0x10372f3d0> # 显示并并不友好 直接显示了内存地址
>>> print(s)
<__main__.Spam object at 0x10372f3d0>
# 重载__repr__后,不管是交互界面直接输出还是print输出都会按照我们定义的输出
>>> class TestRepr(Spam):
... def __repr__(self):
... return 'TestRepr: %s' % self.name
...
>>> tr = TestRepr()
>>> tr
TestRepr: Bob
>>> print(tr)
TestRepr: Bob
# 重载__str__后,只有print输出都会按照我们定义的输出
>>> class TestStr(Spam):
... def __str__(self):
... return 'TestStr: %s' % self.name
...
>>> ts = TestStr()
>>> ts
<__main__.TestStr object at 0x102900410>
>>> print(ts)
TestStr: Bob
# 一个类可以同时拥有两者用来显示不同的信息
>>> def str(self):
... return 'This is Str %s' % self.name
>>> TestRepr.__str__ = str
>>> tr
TestRepr: Bob
>>> print(tr)
This is Str Bob
- __repr__方法通常用于提供对象的一种代码底层级显示
- __str__方法适用于更加用户有好的显示
一个类可以同时提供以上两种方法,打印运行__str__方法而交互式命令行采用__repr__方法,你可以为两种不同的观众定义不同的打印,让开发者看到额外的细节。