What is the difference between __str__ and __repr__ in Python
from
https://www.pythoncentral.io/what-is-the-difference-between-__str__-and-__repr__-in-python/
目的
官方解释:
object.__repr__(self)
: called by therepr()
built-in function and by string conversions (reverse quotes) to compute the "official" string representation of an object.
object.__str__(self)
: called by thestr()
build-in function and by the print statement to compute the "informal" string representation of an object.Quote from Python's Data Model
两者都是对对象的表述, repr是正式的解释, str是信息形式的解释
基本类型的的默认实现
>>> x = 1>>> repr(x)'1'>>> str(x)'1'>>> y = 'a string'>>> repr(y)"'a string'">>> str(y)'a string'
对于整数没有差别, 对于字符串, 我们可以看到差别
While the return of
repr()
andstr()
are identical forint x
, you should notice the difference between the return values forstr y
. It is important to realize the default implementation of__repr__
for astr
object can be called as an argument toeval
and the return value would be a validstr
object
repr的返回值可以被eval再还原回字符串。
>>> repr(y)"'a string'">>> y2 = eval(repr(y))>>> y == y2True
复杂对象
Therefore, a "formal" representation of an object should be callable by eval() and return the same object, if possible. If not possible, such as in the case where the object's members are referring itself that leads to infinite circular reference, then
__repr__
should be unambiguous and contain as much information as possible.
对于非基本类型的复杂对象, 则不能被eval计算还原, 这种情况必须遵守 意思清楚的 , 包括信息尽量多的原则。
>>> class ClassB(object):... def __init__(self, a=None):... self.a = a...... def __repr__(self):... return '%s(a=a)' % (self.__class__)...>>> a = ClassA()>>> b = ClassB(a=a)>>> a.b = b>>> repr(a)"<class '__main__.ClassA'>(<class '__main__.ClassB'>(a=a))">>> repr(b)"<class '__main__.ClassB'>(a=a)"
内置对象的可读性
The
__str__
representation of now looks cleaner and easier to read than the formal representation generated from__repr__
. Sometimes, being able to quickly grasp what's stored in an object is valuable to grab the "big" picture of a complex program.
str更加注重可读性, 一眼就可以获取对象内容,不关注实现的细节。
>>> from datetime import datetime>>> now = datetime.now()>>> repr(now)'datetime.datetime(2013, 2, 5, 4, 43, 11, 673075)'>>> str(now)'2013-02-05 04:43:11.673075'
Tips and Suggestions between __str__ and __repr__ in Python
- Implement
__repr__
for every class you implement. There should be no excuse.- Implement
__str__
for classes which you think readability is more important of non-ambiguity.
What is the difference between __str__ and __repr__ in Python的更多相关文章
- python中__str__与__repr__的区别
__str__和repr __str__和__repr__都是python的内置方法,都用与将对象的属性转化成人类容易识别的信息,他们有什么区别呢 来看一段代码 from math import hy ...
- python 的特殊方法 __str__和__repr__
__str__和__repr__ 如果要把一个类的实例变成 str,就需要实现特殊方法__str__(): class Person(object): def __init__(self, name, ...
- __str__与__repr__
在讲解之前,我们先来了解下str和repr的区别:两者都是用来将数字,列表等类型的数据转化为字符串的形式.不同之处在于str更加类似于C语言中使用printf输出的内容,而repr输出的内容会直接将变 ...
- python之反射和内置函数__str__、__repr__
一.反射 反射类中的变量 反射对象中的变量 反射模块中的变量 反射本文件中的变量 .定义:使用字符串数据类型的变量名 来获取这个变量的值 例如: name = 'xiaoming' print(nam ...
- python __str__() 和 __repr__()是干啥的
1. 没定义__str__() print的时候得不到自己想要的东西 类默认转化的字符串基本没有我们想要的一些东西,仅仅包含了类的名称以及实例的 ID (理解为 Python 对象的内存地址即可).虽 ...
- isinstance,issubclass,内置函数__str__和__repr__,__format__,dir()函数
isinstance(obj,cls) 检查是否obj是否是类 cls 的对象 #对象与类之间的关系 判断第一个参数是否是第二个参数的实例 # 身份运算 # 2 == 3 # 值是否相等# 2 is ...
- 9.4、__del__、__doc__、__dict__、__module__、__getitem__、__setitem__、__delitem__、__str__、__repr__、__call__
相关内容: __del__.__doc__.__dict__.__module__.__getitem__.__setitem__.__delitem__.__str__.__repr__.__cal ...
- python 全栈开发,Day24(复习,__str__和__repr__,__format__,__call__,__eq__,__del__,__new__,item系列)
反射: 使用字符串数据类型的变量名来使用变量 wwwh即what,where,why,how 这4点是一种学习方法 反射 :使用字符串数据类型的变量名来使用变量 1.文件中存储的都是字符串 2.网络 ...
- python全栈开发day23-面向对象高级:反射(getattr、hasattr、setattr、delattr)、__call__、__len__、__str__、__repr__、__hash__、__eq__、isinstance、issubclass
一.今日内容总结 1.反射 使用字符串数据类型的变量名来操作一个变量的值. #使用反射获取某个命名空间中的值, #需要 #有一个变量指向这个命名空间 #字符串数据类型的名字 #再使用getattr获取 ...
随机推荐
- Review: Command-line about Git
Git shanzm
- Ubuntu 16.04 安装系统监视器System Monitor
安装好Ubuntu 16.04 之后,如何查看系统进程,CPU等的使用情况呢,System Monitor可以做到, 安装步骤: sudo add-apt-repository ppa:fossfre ...
- centos 7 selinux开启关闭
1 查看selinux状态 [root@localhost ~]# sestatus SELinux status: disabled 2 关闭 零时关闭 [root@localhost ~]# se ...
- docker镜像和容器的导出导入
本文介绍docker镜像和容器的导入导出,用于迁移.备份.升级等场景.主要用到export.import.save.load四个方法. 原文地址:代码汇个人博客 http://www.codehui. ...
- 伺服电机&旋转变压器&光电编码器
旋转变压器与光电编码器是目前伺服领域应用最广的测量传感器. 一.伺服系统 又称为随动系统,精确的跟随或者复现某个过程的反馈系统. 使物体的位置.方位.状态等输出被控量能够跟随目标(设定)的任意变化的自 ...
- Webstorm 2018 激活破解
本文最后更新于 2018-5-4 可能会因为没有更新而失效.如已失效或需要修正,请留言! 问题 激活 webstorm 2018 最新版 解决步骤 License server:http://hb5. ...
- Django入门之路
Web框架开发-Django基础之web应用,Http协议 web框架开发-web框架简介,wsgiref模块,DIY一个web框架 web框架开发-Django简介 web框架开发-静态文件配置 w ...
- Cordova入门系列(一)创建项目 转发 https://www.cnblogs.com/lishuxue/p/6008678.html
版权声明:本文为博主原创文章,转载请注明出处 Cordova是什么? 初学Cordova的人,虽然了解一点点,知道Cordova是用来将html, css, js变成app的,但并不知道到底是怎么用的 ...
- sqlplus: error while loading shared libraries: libsqlplus.so: cannot open shared object file
sqlplus: error while loading shared libraries: libsqlplus.so: cannot open shared object file 1. 权限问题 ...
- QPalette
Help on class QPalette in module PyQt5.QtGui: class QPalette(sip.simplewrapper) | QPalette() | QPa ...