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正则表达式中的括号匹配问题
Dec 14 Python
python同时给两个收件人发送邮件的方法
Apr 30 Python
python实现将汉字转换成汉语拼音的库
May 05 Python
解析Python中while true的使用
Oct 13 Python
python+influxdb+shell编写区域网络状况表
Jul 27 Python
Selenium(Python web测试工具)基本用法详解
Aug 10 Python
PYTHON实现SIGN签名的过程解析
Oct 28 Python
python3 动态模块导入与全局变量使用实例
Dec 22 Python
Python综合应用名片管理系统案例详解
Jan 03 Python
简单了解python filter、map、reduce的区别
Jan 14 Python
基于Numba提高python运行效率过程解析
Mar 02 Python
keras-siamese用自己的数据集实现详解
Jun 10 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
完美解决PHP中文乱码
2009/11/26 PHP
ThinkPHP中html:list标签用法分析
2016/01/09 PHP
Laravel 5.3 学习笔记之 错误&amp;日志
2016/08/28 PHP
CheckBox 如何实现全选?
2006/06/23 Javascript
jQuery模拟超链接点击效果代码
2013/04/21 Javascript
javascript 实现键盘上下左右功能的小例子
2013/09/15 Javascript
jquery ajax jsonp跨域调用实例代码
2013/12/11 Javascript
JavaScript保留两位小数的2个自定义函数
2014/05/05 Javascript
firefox浏览器用jquery.uploadify插件上传时报HTTP 302错误
2015/03/01 Javascript
JavaScript中removeChild 方法开发示例代码
2016/08/15 Javascript
Javascript 创建类并动态添加属性及方法的简单实现
2016/10/20 Javascript
JS实现点击表头表格自动排序(含数字、字符串、日期)
2017/01/22 Javascript
jQuery中map函数的两种方式
2017/04/07 jQuery
node中Express 动态设置端口的方法
2017/08/04 Javascript
JS匿名函数和匿名自执行函数概念与用法分析
2018/03/16 Javascript
原来JS还可以这样拆箱转换详解
2019/02/01 Javascript
[01:14:31]Secret vs VG 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
Python实现基于HTTP文件传输实例
2014/11/08 Python
Sanic框架Cookies操作示例
2018/07/17 Python
Python2和3字符编码的区别知识点整理
2019/08/08 Python
python 计算两个列表的相关系数的实现
2019/08/29 Python
pandas dataframe 中的explode函数用法详解
2020/05/18 Python
基于django micro搭建网站实现加水印功能
2020/05/22 Python
canvas 绘图时位置偏离的问题解决
2020/09/16 HTML / CSS
澳大利亚网上玩具商店:Mr Toys Toyworld
2018/03/25 全球购物
Java工程师面试集锦之Spring框架
2013/06/16 面试题
集团公司总经理岗位职责
2013/12/20 职场文书
好邻里事迹材料
2014/01/16 职场文书
文明之星事迹材料
2014/05/09 职场文书
保安公司服务承诺书
2014/05/28 职场文书
机电一体化专业求职信
2014/07/22 职场文书
好人好事新闻稿
2015/07/17 职场文书
2016年基层党组织创先争优承诺书
2016/03/25 职场文书
2019终止劳动合同协议书最新范本!
2019/07/09 职场文书
php远程请求CURL案例(爬虫、保存登录状态)
2021/04/01 PHP
php双向队列实例讲解
2021/11/17 PHP