一文让你彻底搞懂Python中__str__和__repr__
作者:宇宙之一粟 发布时间:2021-10-30 20:09:56
__str__和__repr__的异同?
字符串的表示形式
我们都知道,Python的内置函数repr()能够把对象用字符串的形式表达出来,方便我们辨认。这就是“字符串表示形式”。repr()就是通过__repr__这个特殊方法来得到一个对象的字符串表示形式的。如果没有实现__repr__,当我们在控制台里打印一个向量的实例时,得到的字符串可能会是 <Vector object at 0x10a514f98>。
>>> class Example: pass
>>> print(str(Example()))
<__main__.Example object at 0x10a514f98>
>>> print(repr(Example()))
<__main__.Example object at 0x1088eb438>
>>>
>>> str(Example)
"<class '__main__.Example'>"
>>> repr(Example())
'<__main__.Example object at 0x1088eb438>'
__str__vs.__repr__
接下来我们看一看**__str__
和__repr__
**有哪些异同。根据Python官方文档定义:
__str__:通过str(object)以及内置函数format()和print()调用以生成一个对象的“非正式”或格式良好的字符串表示。返回值必须是字符串对象。
__repr__:是由repr()内置函数调用,用来输出一个对象的“官方”字符串表示。返回值必须是字符串对象,此方法通常被用于调试。内置类型 object 所定义的默认实现会调用 object.__repr__()。
什么正式与非正式格式,你已经搞懵了是吗?没事,我们接着看:
1. 两者都能输出对象
>>> x = 4
>>> repr(x)
'4'
>>> str(x)
'4'
>>> y = 'pythonic'
>>> repr(y)
"'pythonic'"
>>> str(y)
'pythonic'
>>> z = '4'
>>> repr(z)
"'4'"
>>> str(z)# 注意,此处的输出结果形式跟str(x)一样,但x和z的类型并不一样
'4'
>>> str(x) == str(z)
True
>>> repr(x) == repr(z)
False
>>> str(4) == str("4")
True
>>> repr(4) == repr("4")
False
当x=4,当x为整数类型时,调用str()和repr()的返回结果是一样,
而当y为字符串类型时,repr(y)的结果就是“正式”的字符串表示,而str(y)的结果则是“非正式”的。str()能够让我们最快速了解到对象的内容,可读性较高。
2 .__str__是可读的,__repr__的目标是明确的
>>> import datetime
>>> d = datetime.datetime.now()
>>> str(d)
'2020-04-04 20:47:46.525245'
>>> repr(d)
'datetime.datetime(2020, 4, 4, 20, 47, 46, 525245)'
>>>
可以看出repr()
更能显示出对象的类型、值等信息,对象描述清晰的。
在 str()
函数被使用,或是在用 print
函数打印一个对象的时候才被调用的,并且它返回的字符串对终端用户更友好。
3. 重写__repr__,那也会使用__str_
class Student():
def __init__(self, name):
self.name = name
def __str__(self):
return "Name:" + self.name
def __repr__(self):
return "姓名:" + self.name
class_one = Student("Alice")
print(class_one)
print(str(class_one))
print(repr(class_one))
输出结果:
Name:Alice
Name:Alice
姓名:Alice
__str__ 的目标是可读的,__str__()并不预期返回一个有效的 Python 表达式,但可以使用更方便或更准确的描述信息。
__repr__ 的目标是明确的,所返回的字符串应该准确、无歧义,并且尽可能表达出如何 用代码创建出这个被打印的对象。
容器的 __str__ 方法的使用包含对象的 __repr__
来源:https://blog.csdn.net/yuzhou_1shu/article/details/105319065


猜你喜欢
- 代码如下:Function htmll(mulu,htmlmulu,FileName,filefrom,htmla,htmlb,h
- CSS换肤技术一直是一个比较热门的话题,通过给HTML文档不同的CSS样式应用,实现完全不同或风格迥异的页面效果。这样的技术一直为大家所津津
- 引言在观察MySQL本地连接的时候,发现对mysql.sock是个啥我不明白,于是我提出了一个问题:mysql.sock到底存了什么信息?根
- 1. iocgo简介习惯于Java或者C#开发的人应该对控制反转与依赖注入应该再熟悉不过了。在Java平台有鼎鼎大名的Spring框架,在C
- 前言每条if语句的核心都是一个值为True或False的表达式,这种表达式被称为条件测试。Python根据条件测试的值为True还是Fals
- 在进行ASP网站开发时,有时需在客户端调用MSSQL数据库的数据进行打印,若调用数据量小,可以通过在客户端运用FileSystemObjec
- 目录最终版本过程借鉴代码思考urllib.request和requestsBeautifulSoup优化处理总结代码复制可直接使用,记得pi
- python 地图经纬度转换、纠偏的代码如下所示:# -*- coding: utf-8 -*-import jsonimport urll
- 前面我们给了Tkinter接管Python输入和输出的介绍,我们不难可以想到,能用Tkinter来开发自己的Python代码编辑器.例如可以
- 使用场景当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们就要用到gi
- 乐观锁乐观锁大多是基于数据版本记录机制实现,一般是给数据库表增加一个"version"字段。读取数据时,将此版本号一同读
- Python中对于数组和列表进行切片操作是很频繁的,当然对于切片的操作可供我们直接使用的函数也是很遍历了,我们今天主要简单总结一下常用集中索
- 前言最近需要通过python来获取cad模型的内容信息,然而笔者也没学过python,只能用过查询+动手摸索一步一步进行下去,然后通过dxf
- Hello,各位读者朋友们好啊,我是小张~这不国庆嘛,就把最近很火的一个韩剧《鱿鱼游戏》刷了下,这部剧整体剧情来说还是非常不错的,很值得一看
- 本文实例讲述了Python实现简单求解给定整数的质因数算法。分享给大家供大家参考,具体如下:接着做题遇到求解质因数分解的问题,思想很简单,就
- function clickButton(id) { &n
- 本人虽然五音不全,但是听歌还是很喜欢的。希望能利用机器自动制作音乐,本我发现了一个比较适合入门的有趣的开源音乐生成模块 PySynth ,文
- 这篇文章主要介绍了Python 实现两个矩形重合面积代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- 登陆流程图:代码实现:#-*- coding=utf-8 -*-import os,sys,getpass'''us
- 说到这个话题,我们有个产品叫群组,为什么人们需要群组?简单说,群组就是个圈子,是有共同爱好和话题的人群聚在一起讨论、分享的地方。这个产品的诞