专栏首页宇宙之_一粟一文让你彻底搞懂`__str__`和`__repr__`?

一文让你彻底搞懂`__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

总结

共同点: 都是用来输出一个对象

区别:

  1. __str__ 的目标是可读的,__str__()并不预期返回一个有效的 Python 表达式,但可以使用更方便或更准确的描述信息。
  2. __repr__ 的目标是明确的,所返回的字符串应该准确、无歧义,并且尽可能表达出如何 用代码创建出这个被打印的对象。
  3. 容器的 __str__ 方法的使用包含对象的 __repr__

参考资料:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python 的魔法方法及用途

    在Python中,所有以 “_ _“ 双下划包起来的方法称为“魔法方法” 魔法方法Python解释器自动给出默认的,因此除非需要改变其内部功能,其它时刻刻使用...

    宇宙之一粟
  • 用Python程序模拟300位观众,为5位嘉宾随机投票,最后按照降序排列结果

    宇宙之一粟
  • 深入理解Python内存管理与垃圾回收,再也不怕问了(二)

    如果一个对象的引用计数为0,Python解释器就会回收这个对象的内存,但引用计数的缺点是不能解决循环引用的问题,所以我们需要标记清除和分代回收。

    宇宙之一粟
  • 萌新不看会后悔的C++string字符串常用知识点总结

    前面学习字符串的时候简单说了string字符串和C风格字符串的不同,今天来详细的学习一下string字符串 过去学习C的时候,想要使用字符串应该是如下的格式:...

    花狗Fdog
  • Python经典面试题

    输入描述: 一行字符串,非空,长度小于5000。 输出描述: 整数N,最后一个单词的长度。

    py3study
  • 字符串的排列

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    喜欢ctrl的cxk
  • 零基础学习 Python 之列表 ( 一 )

    大家好,这里是零基础学习 Python 系列,在这里我将从最基本的Python 写起,然后再慢慢涉及到高阶以及具体应用方面。我是完全自学的 Python,所以很...

    Rocky0429
  • Python 基础 字符串的索引与切片

    字符串是一个字符序列,那么如何访问字符串中的一个或者多个字符呢?在Python中,可以通过索引和切片的操作来完成。

    用户7886150
  • python之字符串的基本使用

    字符串 就是 一串字符,是编程语言中表示文本的数据类型在 Python 中可以使用 一对双引号 " 或者 一对单引号 ' 定义一个字符串

    用户7886150
  • Python基础(3)——字符串

    切片的语法:[起始:结束:步长],选取的区间属于左闭右开型,即从"起始"位开始,到"结束"位的前一位结束(不包含结束位本身)。

    羊羽shine

扫码关注云+社区

领取腾讯云代金券