Python中__repr__和__str__区别详解


Posted in Python onNovember 07, 2019

看下面的例子就明白了

class Test(object):
  def __init__(self, value='hello, world!'):
    self.data = value

>>> t = Test()
>>> t
<__main__.Test at 0x7fa91c307190>
>>> print t
<__main__.Test object at 0x7fa91c307190>

看到了么?上面打印类对象并不是很友好,显示的是对象的内存地址

下面我们重构下该类的__ repr__以及str,看看它们俩有啥区别

# 重构__repr__
class TestRepr(Test):
  def __repr__(self):
    return 'TestRepr(%s)' % self.data

>>> tr = TestRepr()
>>> tr        直接终端显示,不print就是面向程序员
TestRepr(hello, world!)
>>> print tr     print是面向程序员
TestRepr(hello, world!)

重构__ repr__方法后,不管直接输出对象还是通过print打印的信息都按我们repr方法中定义的格式进行显示了

# 重构__str__
calss TestStr(Test):
  def __str__(self):
    return '[Value: %s]' % self.data

>>> ts = TestStr()
>>> ts
<__main__.TestStr at 0x7fa91c314e50>
>>> print ts
[Value: hello, world!]

你会发现,直接输出对象ts时并没有按我们str方法中定义的格式进行输出,而用print输出的信息却改变了

repr和str这两个方法都是用于显示的,str是面向用户的,而repr面向程序员。

打印操作会首先尝试str和str内置函数(print运行的内部等价形式),它通常应该返回一个友好的显示。

__ repr__用于所有其他的环境中:用于交互模式下提示回应以及repr函数,如果没有使用str,会使用print和str。它通常应该返回一个编码字符串,可以用来重新创建对象,或者给开发者详细的显示。

当我们想所有环境下都统一显示的话,可以重构repr方法;当我们想在不同环境下支持不同的显示,例如终端用户显示使用str,而程序员在开发期间则使用底层的repr来显示,实际上str只是覆盖了repr以得到更友好的用户显示。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
详解Python中的join()函数的用法
Apr 07 Python
Python中文件操作简明介绍
Apr 13 Python
python使用wxPython打开并播放wav文件的方法
Apr 24 Python
python中set常用操作汇总
Jun 30 Python
python交互式图形编程实例(二)
Nov 17 Python
在Python中pandas.DataFrame重置索引名称的实例
Nov 06 Python
浅谈Python采集网页时正则表达式匹配换行符的问题
Dec 20 Python
在Python 中实现图片加框和加字的方法
Jan 26 Python
详解PyCharm安装MicroPython插件的教程
Jun 24 Python
python打开音乐文件的实例方法
Jul 21 Python
python中selenium库的基本使用详解
Jul 31 Python
Python和Bash结合在一起的方法
Nov 13 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
Nov 07 #Python
Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析
Nov 07 #Python
Python中xml和dict格式转换的示例代码
Nov 07 #Python
python对象转字典的两种实现方式示例
Nov 07 #Python
python多线程高级锁condition简单用法示例
Nov 07 #Python
python文件操作的简单方法总结
Nov 07 #Python
详解Django admin高级用法
Nov 06 #Python
You might like
PHP4实际应用经验篇(5)
2006/10/09 PHP
解析php利用正则表达式解决采集内容排版的问题
2013/06/20 PHP
php根据生日计算年龄的方法
2015/07/13 PHP
PHP数据的提交与过滤基本操作实例详解
2016/11/11 PHP
RR vs IO BO3 第二场2.13
2021/03/10 DOTA
Javascript 面向对象(一)(共有方法,私有方法,特权方法)
2012/05/23 Javascript
基于jQuery的动态增删改查表格信息,可左键/右键提示(原创自Zjmainstay)
2012/07/31 Javascript
js解析与序列化json数据(三)json的解析探讨
2013/02/01 Javascript
很好用的js日历算法详细代码
2013/03/07 Javascript
JS:window.onload的使用介绍
2013/11/13 Javascript
js制作带有遮罩弹出层实现登录注册表单特效代码分享
2015/09/05 Javascript
easyui combobox开启搜索自动完成功能的实例代码
2016/11/08 Javascript
js实现tab选项卡切换功能
2017/01/13 Javascript
浅谈JS中的常用选择器及属性、方法的调用
2017/07/28 Javascript
浅谈webpack下的AOP式无侵入注入
2017/11/12 Javascript
bootstrap table表格插件之服务器端分页实例代码
2018/09/12 Javascript
Vue中props的详解
2019/05/16 Javascript
bootstrap table列和表头对不齐的解决方法
2019/07/19 Javascript
layui实现form表单同时提交数据和文件的代码
2019/10/25 Javascript
vue中可编辑树状表格的实现代码
2020/10/31 Javascript
vue实现动态表格提交参数动态生成控件的操作
2020/11/09 Javascript
[01:14:05]《加油DOTA》第四期
2014/08/25 DOTA
浅谈python脚本设置运行参数的方法
2018/12/03 Python
自学python的建议和周期预算
2019/01/30 Python
python 使用cycle构造无限循环迭代器
2020/12/02 Python
英国最红的高街时尚品牌:Topshop
2016/08/05 全球购物
大学本科毕业生的自我鉴定范文
2013/11/19 职场文书
销售副总经理岗位职责
2013/12/11 职场文书
师范学院毕业生求职信范文
2013/12/26 职场文书
新闻传播专业求职信
2014/07/22 职场文书
学校总务处领导班子民主生活会对照检查材料思想汇报
2014/09/27 职场文书
综治维稳工作汇报
2014/10/27 职场文书
2014年合同管理工作总结
2014/12/02 职场文书
大学学生会主席竞选稿
2015/11/19 职场文书
详解MySQL的Seconds_Behind_Master
2021/05/18 MySQL
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
2022/07/07 Java/Android