python中的str方法和repr方法_Python中 的 __str__ 方法和 __repr__ 方法的区别有哪些

Python中 的 __str__ 方法和 __repr__ 方法的区别有哪些

发布时间:2020-11-05 17:11:48

来源:亿速云

阅读:95

作者:Leah

本篇文章给大家分享的是有关Python中 的 __str__ 方法和 __repr__ 方法的区别有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

阅读到 Strings 中关于转换对象为字符串的内容,介绍了 repr 函数,趁着还没有真正了解 Python 面向对象的生疏与热度,感性上理解一下 repr 与 str 这两个函数的区别。

Python 的全局方法 repr 和 str 会映射到对象的 __repr__ 和 __str__ 的方法调用,还有 str(obj) 时会调用哪个方法,以及 print(obj) 和调试 Python 代码时的对象显示会调用哪个方法呢?这就是本文想要印证的内容。

恰如 Java 的 System.out.println(obj) 或"hello" + obj都会调用 Java 对象的 toString()方法,那么 Python 中是怎么一回事呢?

来自某本 Python 入门书的解释repr和 str:repr: formal string representation of a Python object

str: informal string representation of a Python object,或者说 printable string representation

首先repr是 representation 的意思,一个是正式,另一个是非正式,看起来 repr 比 str 显得重要些。

对于内置的 Python 对象我们可以用 repr, print, 和 str 函数,如针对 list 类型

>>> repr([1,2])

'[1, 2]'

>>> print([1,2])

[1, 2]

>>> str([1,2])

'[1, 2]'

但是具体上面三个函数中分别调用了 list 的什么方法就不可而知了,这时候定义一个自己的类最能说明问题。测试环境为 IntelliJ, 以调试截图来说明分别为 __str__和__repr__几种组合情况

只定义了 __str__ 方法

cd89c7bdd9416bb7cddd3f7b61437b4f.png

说明:在只定义了 __str__方法的情况下调试时 IntelliJ 在行内显示对象为__str__的输出,但变量窗口中显示的是默认的__repr__的输出

repr始终坚持调用默认的__repr__方法

str 转型函数调用了 __str__方法

print调用了 __str__方法

只定义了 __repr__ 方法

5d0d6792ecc58403c257087a75ebced1.png

说明:在只定义了 __repr__方法的情况下,可以看出 __repr__方法极其强势,它垄断了一切的调用,repr, str, 和 print函数,甚至是 IntelliJ 的调试显示都必须以 __repr__方法为核心。以上所有的情况都是调用 __repr__ 方法,没得选择

同时定义了 __repr__ 和 __str__ 方法

b4a3c033fb96442820065d87ea8a2129.png

说明:在同时定义了 __repr__和 __str__方法的情况下,__str__方法反而能扳回来。除了明确的 repr 会调用 __repr__方法,和调试时变量窗口中显示对象会调用 __repr__方法外,其他时候都是 __str__ 占优。具体为repr 和 IntelliJ 调试时变量窗口显示变量调用 __repr__ 方法

IntelliJ 调试时行内显示变量调用了 __str__ 方法

str 转型操作调用了对象的 __str__ 方法,这不能解释为 informal 非正式的

print 调用了 __str__ 来获得对象输出字符串

另外,格式化字符串时的调用的对象方法与 print时是一样的,例如下面的格式化代码

f1 = "%s" % t

f2 = "{}".format(t)

Python 不知道像 Java 那样由字符串加上一个对象

"this is " + t #Java 中会展开为 "this is " + t.toString()

Python 会报以下错误TypeError: can only concatenate str (not "Test") to str

说这里的 + 号只能连接两个字符串,除非定义了 __add__和 __radd__方法,对应关系分别为

t = Test()

z1 = 'hello' + t #相当于 t.__radd__('hello')

z2 = t + 'hello' #相当于 t.__add__('hello')

Python 的 __xyz__也挺魔幻的。

以上就是Python中 的 __str__ 方法和 __repr__ 方法的区别有哪些,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

requestbody前端怎么传_学习前端开发前的基础知识了解「V1001」

一、什么是http协议?什么是协议,就是一群人协商好了,统一认知的规则。【例】你,我,他,还有她他他,大家一致认定结婚的时候都要给份子钱,这种大家认同的就是协议。http协议,就规定了…

postmapping注解参数说明_从零搭建后端框架:优雅的参数校验Validator

前两天项目群里发生了关于参数校验的问题讨论,很多开发团队没有对这些做硬性规范时,还是有很多童鞋本着“不多事”的原则,产品文档里没有特别说明就不写。对于2B的产品经理来说,因为一次新迭代,可能回涉及到N多的页面&…

java竖线分割_Java String类的Split以竖线作为分隔符

版权声明:本文为博主原创文章,转载请写明出处。https://blog.csdn.net/wo541075754/article/details/50668160问题Java中String类的Split方法,当用“|”进行分割时,发现并不能达到预期的效果。比如:分割字符串“ABC|DE…

ups计算软件_浅析UPS与蓄电池与逆变器的区别

早期的电信机房中,通常采用将220V交流电源经过整流,为48V电池组充电,由电池组直接给程控交换机供电。随着计算机网络和通信网络在电信机房的应用,需要为其提供高质量的220V的交流电源。由于有现有的48V电池组,所以通常…

java字符转为数字_Java 判断字符串能否转化为数字的三种方法

linux shell 常用指令1. man 对你熟悉或不熟悉的命令提供帮助解释 eg:man ls 就可以查看ls相关的用法 注:按q键或者ctrlc退出,在linux下可以使用ctrlc终止当前程序运行. 2. ls 查看目 ...在uwp中复活常用的vb库函数这个博文是纯原创的,转载一定要说明作者是 Nukepayload2!! 在.…

python调用gpu进行运算_tensorflow指定CPU与GPU运算的方法实现

1.指定GPU运算如果安装的是GPU版本,在运行的过程中TensorFlow能够自动检测。如果检测到GPU,TensorFlow会尽可能的利用找到的第一个GPU来执行操作。如果机器上有超过一个可用的GPU,除了第一个之外的其他的GPU默认是不参与计算的。为了让Tensor…

java和网易我的世界有什么区别_网易我的世界手机版对比正版JAVA版我的世界有什么区别?...

你说的这部分都属于游戏内部机制问题首先网易手机版实质上就是基岩版,还是更新贼慢的基岩版(笑)。所以题主完全可以去minecraft wiki查找相关资料然后我说一下我知道的一些主要差异吧刷怪效率吧基岩版明显不如java版,所以通用的黑暗刷怪塔在基岩版是不怎…

python jieba词频统计英文文本_python实战,中文自然语言处理,应用jieba库来统计文本词频...

模块介绍安装:pip install jieba 即可jieba库,主要用于中文文本内容的分词,它有3种分词方法:1. 精确模式, 试图将句子最精确地切开,适合文本分析:2. 全模式,把句子中所有的可以成词的词语都扫描…

java修改已创建程序界面_Java应用程序的Web用户界面

应用服务器。您认为Tomcat在运行时占用空间、学习量或…?我倾向于选择与一个IDE有良好集成的东西。所以EclipseTomcat或者ApacheGeronimo,可能在里面WebSphere Community Edition伪装可以完成这项工作。从我所看到的情况来看,这些足以满足您的需求,而且学习曲线实际上是可以管…

python+selenium获取cookie session_selenium获取cookie及设置cookie

获取cookie:在打开的页面使用self.driver.get_cookies()返回下面数据:[{domain: .linkedin.com,expiry: 1553,httpOnly: False,name: liap,path: /,secure: False,value: true},{domain: .linkedin.com,expiry: 154613,httpOnly: False,name: lidc,path:…

js url解码gbk_JS中对URL进行转码与解码

1. escape 和 unescapeescape()不能直接用于URL编码,它的真正作用是返回一个字符的Unicode编码值。采用unicode字符集对指定的字符串除0-255以外进行编码。所有的空格符、标点符号、特殊字符以及更多有联系非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在…

python常用模块用法_python常用模块(一)

#什么是模块呢?就是用一大坨代码来完成一个功能的代码集合,是不是简单易懂#类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能…

java jdbc init_Java 的JDBC 数据库连接池实现方法

虽然 J2EE 程序员一般都有现成的应用服务器所带的JDBC 数据库连接池,不过对于开发一般的 Java Application 、 Applet 或者 JSP、velocity 时,我们可用的JDBC 数据库连接池并不多,并且一般性能都不好。 Java 程序员都很羡慕 Windows ADO &…

python db文件_python中查看.db文件中表格的名字及表格中的字段操作

1.问题描述: 我桌面上有一个“账号密码.db”文件,我现在想知道里面有几张表格table、表格的名字、表头结构。2.使用SQL语句"""select name from sqlite_master where typetable order by name""",查找表格的名…

django调用java_07.手把手教将深度学习利用Django将模型发布成服务供java调用

标题问题一.python发布成服务1.先建立一个深度学习模型并训练好2.建立一个预测方法去调用训练好的模型3.建立一个Django工程4.将python利用模型预测的代码放入Django项目中5.get请求加上参数6.github二.JAVA请求url,返回json数据问题python作为一个含科学计算与深度…

springboot转发http请求_网易后端实习生分享:Springboot异常和错误处理规范

由于错误在所难免,异常处理已经成为开发工作中不可或缺的部分。在web开发中,我们通常不希望用户看到一个写满StackTrace的错误页面;同时,我们希望出现错误或发生异常时,开发运维人员可以看到详细的错误信息&#xff0c…

java 偏向锁 怎么用_Java锁升级、偏向锁、轻量级锁

偏向锁当锁对象第一次被线程获取时,虚拟机会把对象头的锁状态标志设置为01(即偏向状态),同时,使用CAS操作把获取到这个锁的线程的ID记录在对象头的mark word中。如果这个CAS操作成功,那么,以后持有这个偏向锁的线程在进…

springmvc 拦截器_Spring MVC拦截器学习

1 介绍Spring Web MVC是基于Servlet API构建的原始Web框架。2 拦截器2.1 定义springmvc框架的一种拦截机制2.2 使用2.2.1 两步走实现HandlerInterceptor接口注册(xml或者注解 )2.2.2 HandlerInterceptor接口实现HandlerInterceptor接口import org.spring…

python如何生成列表和元组数据_Python数据类型(列表和元组)

1.3 List(列表)列表由一系列按特定顺序排列的元素组成。在Python中,用方括号[ ]来表示列表,并用逗号来分隔其中的元素。1.3.1 访问列表元素在Python中,第一个列表元素的索引为0,而不是1。>>> bicycles [trek, cannondal…

mysql socket 与IP区别_MySQL本地用IP登陆而非socket

##想当然的指定hostname和端口。。。。失败[rootmysql01 ~]# /opt/mysql/bin/mysql -uroot -h localhost -P 3307 -pEnter password:ERROR 2002 (HY000): Cant connect to local MySQL server through socket /tmp/mysql.sock (2)##正确方法,指定通信协议 --protoco…