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使用Queue在多个子进程间交换数据的方法
Apr 18 Python
详解在Python中处理异常的教程
May 24 Python
Python实现二分查找算法实例
May 26 Python
Python的条件语句与运算符优先级详解
Oct 13 Python
Python排序搜索基本算法之堆排序实例详解
Dec 08 Python
python使用rpc框架gRPC的方法
Aug 24 Python
python matplotlib实现双Y轴的实例
Feb 12 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
Dec 04 Python
django实现后台显示媒体文件
Apr 07 Python
python实现数字炸弹游戏
Jul 17 Python
详解Scrapy Redis入门实战
Nov 18 Python
OpenCV-Python使用cv2实现傅里叶变换
Jun 09 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大小写问题:函数名和类名不区分,变量名区分
2013/06/17 PHP
解析如何修改phpmyadmin中的默认登陆超时时间
2013/06/25 PHP
ThinkPHP 3使用OSS的方法
2018/07/19 PHP
详解php反序列化
2020/06/10 PHP
JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
2008/11/03 Javascript
JS获取屏幕,浏览器窗口大小,网页高度宽度(实现代码)
2013/12/17 Javascript
关闭浏览器窗口弹出提示框并且可以控制其失效
2014/04/15 Javascript
谈谈js中的prototype及prototype属性解释和常用方法
2015/11/25 Javascript
Javascript基础之数组的使用
2016/05/13 Javascript
详解js实现线段交点的三种算法
2016/08/09 Javascript
微信小程序 wxapp内容组件 icon详细介绍
2016/10/31 Javascript
从零学习node.js之详解异步控制工具async(八)
2017/02/27 Javascript
mpvue跳转页面及注意事项
2018/08/03 Javascript
Vue 框架之动态绑定 css 样式实例分析
2018/11/14 Javascript
微信小程序自定义头部导航栏和导航栏背景图片 navigationStyle问题
2019/07/26 Javascript
javascript数组元素删除方法delete和splice解析
2019/12/09 Javascript
解决vue-router路由拦截造成死循环问题
2020/08/05 Javascript
Postman无法正常返回结果问题解决
2020/08/28 Javascript
基于JavaScript实现简单扫雷游戏
2021/01/02 Javascript
Python实现信用卡系统(支持购物、转账、存取钱)
2016/06/24 Python
python中的字典操作及字典函数
2018/01/03 Python
python使用 cx_Oracle 模块进行查询操作示例
2019/11/28 Python
python dumps和loads区别详解
2020/02/04 Python
Python 随机按键模拟2小时
2020/12/30 Python
canvas需要在标签里直接定义宽高
2014/12/17 HTML / CSS
HTML5制作表格样式
2016/11/15 HTML / CSS
移动端html5判断是否滚动到底部并且下拉加载
2019/11/19 HTML / CSS
美赞臣新加坡官方旗舰店:Enfagrow新加坡
2019/05/15 全球购物
声明struct x1 { . . . }; 和typedef struct { . . . }x2;有什么不同
2012/06/02 面试题
将一个数的从第5位开始的7个数取出,其余位置0
2016/05/26 面试题
党员创先争优活动总结
2014/05/04 职场文书
大学迎新生标语
2014/10/06 职场文书
创业计划书之书店
2019/09/10 职场文书
经典人生语录分享:不畏将来,不念过去,笑对当下
2019/12/12 职场文书
Vue CLI中模式与环境变量的深入详解
2021/05/30 Vue.js
高并发下Redis如何保持数据一致性(避免读后写)
2022/03/18 Redis