Python中通过__str__和__repr__自定义对象字符串显示

苏见山
苏见山
发布时间:2026-10-14| 3人浏览过
原创

本文介绍如何在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改变对象字符串显示的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。