Python改变对象的字符串显示的方法


Posted in Python onAugust 01, 2020

问题

你想改变对象实例的打印或显示输出,让它们更具可读性。

解决方案

要改变一个实例的字符串表示,可重新定义它的 __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 相关文章推荐
Python使用pickle模块存储数据报错解决示例代码
Jan 26 Python
Python实现XML文件解析的示例代码
Feb 05 Python
python+webdriver自动化环境搭建步骤详解
Jun 03 Python
pytorch获取vgg16-feature层输出的例子
Aug 20 Python
Django import export实现数据库导入导出方式
Apr 03 Python
使用IPython或Spyder将省略号表示的内容完整输出
Apr 20 Python
Django 解决阿里云部署同步数据库报错的问题
May 14 Python
python中rc1什么意思
Jun 19 Python
基于python模拟TCP3次握手连接及发送数据
Nov 06 Python
如何利用python正则表达式匹配版本信息
Dec 09 Python
django上传文件的三种方式
Apr 29 Python
你需要掌握的20个Python常用技巧
Feb 28 Python
Python 如何定义匿名或内联函数
Aug 01 #Python
Python sqlalchemy时间戳及密码管理实现代码详解
Aug 01 #Python
Python如何读写二进制数组数据
Aug 01 #Python
Python将字典转换为XML的方法
Aug 01 #Python
Python Flask异步发送邮件实现方法解析
Aug 01 #Python
Python实现弹球小游戏
Aug 01 #Python
序列化Python对象的方法
Aug 01 #Python
You might like
php中时间轴开发(刚刚、5分钟前、昨天10:23等)
2011/10/03 PHP
php生成excel列序号代码实例
2013/12/24 PHP
php堆排序实现原理与应用方法
2015/01/03 PHP
php实现QQ空间获取当前用户的用户名并生成图片
2015/07/25 PHP
CL vs ForZe BO5 第四场 2.13
2021/03/10 DOTA
jquery 图片 上一张 下一张 链接效果(续篇)
2010/04/20 Javascript
一款Jquery 分页插件的改造方法(服务器端分页)
2011/07/11 Javascript
jquery $.each 和for怎么跳出循环终止本次循环
2013/09/27 Javascript
使用 js+正则表达式为关键词添加链接
2014/11/11 Javascript
JS限制文本框只能输入数字和字母方法
2015/02/28 Javascript
js创建jsonArray传输至后台及后台全面解析
2016/04/11 Javascript
对Js OOP编程 创建对象的一些全面理解
2016/07/26 Javascript
Bootstrap的Carousel配合dropload.js实现移动端滑动切换图片
2017/03/10 Javascript
JS实现针对给定时间的倒计时功能示例
2017/04/11 Javascript
JS实现点击Radio动态更新table数据
2017/07/18 Javascript
Angular+Bootstrap+Spring Boot实现分页功能实例代码
2017/07/21 Javascript
JS+canvas动态绘制饼图的方法示例
2017/09/12 Javascript
JS+H5 Canvas实现时钟效果
2018/07/20 Javascript
微信小程序实用代码段(收藏版)
2019/12/17 Javascript
vue webpack build资源相对路径的问题及解决方法
2020/06/04 Javascript
python字符串替换示例
2014/04/24 Python
python设置检查点简单实现代码
2014/07/01 Python
Python操作MySQL简单实现方法
2015/01/26 Python
Python的多态性实例分析
2015/07/07 Python
python tools实现视频的每一帧提取并保存
2020/03/20 Python
python aiohttp的使用详解
2019/06/20 Python
python实现邮件发送功能
2019/08/10 Python
pandas中read_csv、rolling、expanding用法详解
2020/04/21 Python
Python 忽略文件名编码的方法
2020/08/01 Python
python爬虫调度器用法及实例代码
2020/11/30 Python
html5 乒乓球(碰撞检测)实例二
2013/07/25 HTML / CSS
协议书模板
2014/04/23 职场文书
项目战略合作意向书
2015/05/08 职场文书
话题作文之财富(600字)
2019/12/03 职场文书
详解Java实践之抽象工厂模式
2021/06/18 Java/Android
docker-compose部署Yapi的方法
2022/04/08 Servers