提出问题

当我们自定义一个类时,打印这个类对象或者在交互模式下直接输入这个类对象按回车,默认显示出来的信息好像用处不大。如下所示

In [1]: classPeople:

...:def __init__(self, name, sex):

...: self.name=name

...: self.sex=sex

...:

In [2]: p = People(‘xiaoming‘, ‘male‘)

In [3]: p

Out[3]: <__main__.people at>In [4]: print(p)<__main__.people object at>

可以发现,两种方式显示出来的信息都是对象所属类的名称以及对象所在的地址,而很多时候这不是我们想要的信息,此时我们可以通过重写__str__和__repr__方法来定制我们想要的信息。

__str__与__repr__简单介绍

__str__ 和 __repr__方法,是自定义类的字符串描述,当我们打印或查看某个对象时,最终看到的结果是这两个方法的返回值。这两个方法返回的都是字符串,但是什么时候调用__str__?什么时候调用__repr__?我们看下面的例子

类中只重写了__str__方法

In [1]: classA:

...:def __str__(self):

...:return ‘__str__‘...:

In [2]: a =A()

In [3]: a

Out[3]: <__main__.a at>In [4]: print(a)__str__

在交互模式下,直接输入对象再回车,返回的结果与原来一样;但是打印对象时,触发了__str__方法。

类中只重写了__repr__方法

In [1]: classB:

...:def __repr__(self):

...:return ‘__repr__‘...:

In [2]: b =B()

In [3]: b

Out[3]: __repr__In [4]: print(b)__repr__

在交互模式下,直接输入对象再回车以及打印对象都触发了__repr__方法。

类中重写了__str__与__repr__方法

In [1]: classC:

...:def __str__(self):

...:return ‘__str__‘...:def __repr__(self):

...:return ‘__repr__‘...:

In [2]: c =C()

In [3]: c

Out[3]: __repr__In [4]: print(c)__str__

在交互模式下,直接输入对象再回车,触发了__repr__方法;打印对象触发__str__方法。

总结一下,当我们直接查看对象(输入对象再回车)时,无论怎样触发的都是__repr__方法;如果自定义类中没有重写这个方法,我们知道Python3中都是新式类,即默认都继承了object类,那么此时就会调用object中的__repr__方法。当我们打印对象时,大多数情况触发的都是__str__方法,但当自定义类中只重写了__repr__方法时,会触发__repr__方法。

str()和repr()函数

str()默认触发__str__方法,repr()默认触发__repr__方法,触发的机制与上述一样;另外,列表、字典等容器总是会触发__repr__方法,代码示例如下:

#类中只重写了__str__方法

In [5]: str(a)

Out[5]: ‘__str__‘In [6]: repr(a)

Out[6]: ‘<__main__.a object at>‘

#类中只重写了__repr__方法

In [5]: str(b)

Out[5]: ‘__repr__‘In [6]: repr(b)

Out[6]: ‘__repr__‘

#类中重写了__str__与__repr__方法

In [5]: str(c)

Out[5]: ‘__str__‘In [6]: repr(c)

Out[6]: ‘__repr__‘

#列表、字典等容器总是会触发__repr__方法

In [53]: print([a])

[<__main__.a object at>]

In [7]: str([c])

Out[7]: ‘[__repr__]‘In [8]: repr([c])

Out[8]: ‘[__repr__]‘In [9]: [c]

Out[9]: [__repr__]

In [10]: print([c])

[__repr__]

__str__与__repr__的本质区别

那__str__与__repr__的本质区别到底是什么呢? 先看官方描述

__str__: Called by str(object) and the built-in functions format() and print() to compute the “informal” or nicely printable string representation of an object.

__repr__: Called by the repr() built-in function to compute the “official” string representation of an object. This is typically used for debugging, so it is important that the representation is information-rich and unambiguous.

总结一下,__str__是一个对象的非正式的、易于阅读的字符串描述,当类str实例化( str(object) )时会被调用,以及会被内置函数format()和print()调用;__repr__是一个对象的官方的字符串描述,会被内置函数repr()方法调用,它的描述必须是信息丰富的和明确的。也就是说__str__返回的结果可读性强,__repr__返回的结果更加准确。再看一个例子

In [1]: importdatetime

In [2]: d =datetime.datetime.now()

In [3]: str(d)

Out[3]: ‘2019-08-24 08:12:17.942242‘ #可读性强

In [4]: repr(d)

Out[4]: ‘datetime.datetime(2019, 8, 24, 8, 12, 17, 942242)‘ #信息更加丰富和准确

总结

在自定义类中,可以通过重写__str__和__repr__方法来定制类对象到字符串的转化。

一般情况下,推荐至少添加一个 __repr__ 方法来定制对象到字符串的自定义转化,__str__ 是可选的。因为默认情况下,在需要却找不到 __str__ 方法的时候,会自动调用 __repr__ 方法。

__str__方法的目标在于可读性,__repr__方法的目标在于准确性。

定义

形容词suitable or fit to be printed or published.

示例

The only comment I can make to reply to that is not printable .

原文:https://www.cnblogs.com/miaoning/p/11399575.html

python中魔法方法repr_python中魔法方法__str__与__repr__的区别相关推荐

  1. python中魔法方法__str__与__repr__的区别

    提出问题 当我们自定义一个类时,打印这个类对象或者在交互模式下直接输入这个类对象按回车,默认显示出来的信息好像用处不大.如下所示 In [1]: class People: ...: def __in ...

  2. python中 str 和 repr_Python中__str__和 __repr__

    __str__, __repr__ 是python类中的两个魔术方法,前者是在类实例当作字符串时调用,后者通常给程序员调试信息时给输出,都可以直接显示类信息.__repr__ = __str__,简单 ...

  3. python中str和repr_python中str()和repr()函数的区别

    Python 有办法将任意值转为字符串:将它传入repr() 或str() 函数. 函数str() 用于将值转化为适于人阅读的形式,而repr() 转化为供解释器读取的形式. 对于数值类型.列表类型, ...

  4. python中repr_python中__str__和__repr__的区别

    __str__是在str()函数被使用,或是在print函数打印一个对象的时候才被调用的,并且它返回的字符串对终端用户更友好. 如果只想实现这两个特殊方法中的一个,__repr__是更好的选择,因为如 ...

  5. python中 str 和 repr_Python中__repr__和__str__区别详解

    看下面的例子就明白了 class Test(object): def __init__(self, value='hello, world!'): self.data = value >> ...

  6. python中魔法方法repr_Python的两个魔法方法:__repr__和__str__

    目录 例子 关系 使用 官方文档 参考 __repr__ 和 __str__ 是 Python 的两个魔法方法(Magic/Special method),更多魔法方法可以参考 A Guide to ...

  7. python 魔法方法常用_Python魔法方法指南

    有很多人说学习Python基础之后不知道干什么,不管你是从w3c还是从廖雪峰的教程学习的,这些教程都有一个特点:只能引你快速入门,但是有关于Python的很多基础内容这些教程中都没介绍,而这些你没学习 ...

  8. python 子串是否在字符串中_python七种方法判断字符串是否包含子串

    1. 使用 in 和 not in in 和 not in 在 Python 中是很常用的关键字,我们将它们归类为 成员运算符. 使用这两个成员运算符,可以很让我们很直观清晰的判断一个对象是否在另一个 ...

  9. python编写ATM类_Python中编写类的各种技巧和方法

    有关 Python 内编写类的各种技巧和方法(构建和初始化.重载操作符.类描述.属性访问控制.自定义序列.反射机制.可调用对象.上下文管理.构建描述符对象.Pickling).你可以把它当作一个教程, ...

最新文章

  1. 分享一波 RabbitMQ 面试题有答案
  2. VIEW层AJAX提交表单到Controller的实体(AJAX传递序列化的输入元素)
  3. 通才和专家:如何选择
  4. SQL Server 分离与附加数据库
  5. 如何快速python入手_初学者怎么才能快速学会Python?
  6. access查询设计sol视图_Access删除索引
  7. WebService开发常用功能详解
  8. 网页设计制作CSS实现隔行换色两种方法
  9. 第八届山东省ACM大学生程序设计竞赛总结
  10. 【鸿蒙开发和安卓开发】如何实现后台弹出界面和开机自启动
  11. pysam筛选reads写bam
  12. Blender烘焙贴图生成静态真实场景
  13. Dynamics CRM2013 Server2012R2下部署ADFS和IFD遇到的问题
  14. steam账号连接服务器遇到问题,无法预料的服务器浏览器反应 - Steam Support
  15. 动态图象专家组 MPEG-4
  16. three - 3 - 基础知识(1. three渲染结构,2.对canvas 进行响应式布局,3.让canvas 画布自适应设备分辨率 )
  17. 纽约峭石之巅观景台:从直入云天的城市之巅眺望纽约全景
  18. 通达OA 2015 8.12版本取消注册功能介绍
  19. 网页错误详细信息 用户代理: Mozilla/4.0 (compatible; MSIE 8.0;
  20. sklearn OneHot编码

热门文章

  1. 解决Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
  2. 使用 easyexcel
  3. Java 学习(一)
  4. 2018_WWW_Dual Graph Convolutional Networks for Graph-Based Semi-Supervised Classification
  5. QQ连连看辅助c++版本的
  6. win10 android可以删吗,图文普及win10系统无法删除android的方式
  7. 基于大数据平台的互联网数据采集平台架构介绍
  8. unity中时间函数
  9. ajax-210810-03---练习全局刷新计算bmi
  10. 青龙2.10.13 稳定版+对接傻妞教程+短信登录+傻妞WEB控制台 超级详细