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获取 ...
随机推荐
- Diagnostics: File file:/tmp/spark-95cbb984-da28-4784-8b99-eb83ad74437f/__spark_libs__1421840316395076250.zip does not exist
搭建spark环境,测试在yarn 上运行spark shell的时候出现的错误:Diagnostics: File file:/tmp/spark-95cbb984-da28-4784-8b99-e ...
- Delphi 拦截输入法输入结果
{ 拦截输入法输入的字符串.向编辑框中输入中文查看效果. Delphi XE7 } unit Unit1; interface uses Winapi.Windows, Winapi.Messages ...
- 数据库【mongodb篇】练习操作
本文的目标是通过大量的示例,来更好的理解如果在Mongodb中进行数据操作: 初入客户端刚利用 mongod命令进入客户端环境,此时对数据库一无所知: 举目四望,想知道现在有哪些数据库, show ...
- oracle有三种类型的异常错误: 预定义 ( Predefined )错误里面的常见错误
oracle有三种类型的异常错误: 预定义 ( Predefined )错误, 非预定义 ( Predefined )错误, 用户定义(User_define) 错误 预定义 ( Predefined ...
- oracle 关于对时间操作的汇总
-- 对时间的操作 对当前日期增加一个小时: SQL> select sysdate, sysdate+numtodsinterval(1,’hour’) from dual ; 对当前日期增加 ...
- 016_python程序变量抽取配置的几种方式
一.json配置文件 json文件的互转,如下例子: 配置文件:example.json { "mysql":{ "host":"localhost& ...
- Namespace讨论
我们需要讨论一个深层次的问题: 为什么不直接在 tape17162c5-00 和 tapd568ba1a-74 上配置 Gateway IP,而是引入一个 namespace,在 namespace ...
- pycharm中运行时添加配置 及pytest模式怎么修改为run模式
会发现不是控制台输出,而是pytest模式. 修改: 当运行时,发现无法运行: 然后点击Add Configuration, 点击加号,点击Python: 选择脚本路径和解释器.点击OK即可.
- EXT 设置编辑框为只读
Ext.getCmp("processResult").setReadOnly(ture); //processResult是属性的id,setReadOnly(ture)设置 ...
- OpenStack端口(15)
一.OpenStack组件使用的默认端口号 openstack openstack service default ports port type keystone Identity service ...