Python中通过__str__和__repr__自定义对象字符串显示
本文介绍如何在Python中通过重新定义__str__()和__repr__()方法来改变实例的字符串显示。__repr__()用于生成代码可重建对象的表示,通常由repr()调用;__str__()用于生成用户友好的可读字符串,由print()和str()调用。合理实现这两个方法能显著提升调试效率和日志可读性。
问题描述
问题
你需要修改对象实例在打印或显示时的输出格式,使其更加清晰易读。
解决方案
解决方案
若要修改实例的字符串表示形式,需重新定义其 __str__() 和 __repr__() 方法。示例如下:
class Pair:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return 'Pair({0.x!r}, {0.y!r})'.format(self)
def __str__(self):
return '({0.x!s}, {0.y!s})'.format(self)
__repr__() 方法返回实例的代码表示形式,通常用于重新构造该实例。内置的 repr() 函数返回该字符串,这与在交互式解释器中直接显示的值相同。__str__() 方法将实例转换为字符串,使用 str() 或 print() 函数时会输出该字符串。例如:
>>> p = Pair(3, 4)
>>> p
Pair(3, 4) # __repr__() output
>>> print(p)
(3, 4) # __str__() output
>>>
此处还演示了在格式化输出时如何指定不同的字符串表现形式。具体而言,!r 格式化代码指明输出应使用 __repr__() 来替代默认的 __str__() 。你可以使用前述类进行如下测试:
>>> p = Pair(3, 4)
>>> print('p is {0!r}'.format(p))
p is Pair(3, 4)
>>> print('p is {0}'.format(p))
p is (3, 4)
>>>
深入讨论
讨论
自定义 __repr__() 和 __str__() 通常被视为良好的编程习惯,因为这能简化调试过程和实例输出。例如,若仅打印或记录某个实例,程序员将看到更详细且更有用的信息。
__repr__() 生成的文本字符串的标准做法是确保 eval(repr(x)) == x 为真。如果确实无法做到这一点,应创建一个有用的文本表示,并使用 < 和 > 括起来。例如:
>>> f = open('file.dat')
>>> f
<_io.TextIOWrapper name='file.dat' mode='r' encoding='UTF-8'>
>>>
如果 __str__() 未被定义,则会使用 __repr__() 来代替输出。
上述 format() 方法的使用看似有趣,其中格式化代码 {0.x} 对应第1个参数的 x 属性。因此,在下面的函数中,0 实际上指代的是 self 本身:
def __repr__(self):
return 'Pair({0.x!r}, {0.y!r})'.format(self)
作为这种实现的一种替代方案,你也可以使用 % 操作符,如下所示:
def __repr__(self):
return 'Pair(%r, %r)' % (self.x, self.y)
以上即为Python改变对象字符串显示的方法的详细内容,更多关于Python改变对象字符串显示的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









