ITPub博客

首页 > 应用开发 > Python > python 中的魔法方法:__str__ 和__repr__

python 中的魔法方法:__str__ 和__repr__

原创 Python 作者:传智黑马 时间:2019-12-24 17:40:55 0 删除 编辑

1. 引言

在学习面向对象的时候,我们知道在 python 中有一类特殊的方法,叫做魔法方法,这种方法的特点如下: 1. 方法定义的时候以两个下划线开头和两个下划线结尾:如 __init__、 __str__和 __repr__ 2. 这类方法一般不需要我们手动调用,在满足某个条件的时候会自动调用,这个满足的条件我们可以成为调用时机。2020学习黑马程序员python教程:http://yun.itheima.com/map/53.html?1912zzp

在Python 中有两个魔法方法都是用来描述对象信息的, __str__和 __repr__,那为什么要定义两个这样的方法呢,其实是他们设计的目的是不一样的: 1.  __repr__的目标是准确性,或者说, __repr__的结果是让解释器用的。 2.  __str__的目标是可读性,或者说, __str__的结果是让人看的。

2. 分析

那下边,我们详细的来看一下,他们的用法: 在不重写 __str__ 和  __repr__的情况下,打印对象的输出结果不太友好,是对象的内存地址,即 id 的结果。

# 定义 Person 类class Person(object):def __init__(self, name):self.name = namep = Person("isaac")

以下为测试输出的结果:

>>> print(p)<__main__.Person object at 0x10f29b940>>>> p<__main__.Person object at 0x10f29b940>>>> p.__str__()'<__main__.Person object at 0x10f29b940>'>>> p.__repr__()'<__main__.Person object at 0x10f29b940>'

这样的输出结果,并不是我们想要的结果,此时我们重写 __str__ 和  __repr__方法。

2.1 重写 __str__ 方法

# 定义 Person 类class Person(object):def __init__(self, name):self.name = namedef __str__(self):return "__str__ 方法 " + self.namep = Person("isaac")

以下为测试结果:

>>> print(p)__str__ 方法 isaac>>> str(p)'__str__ 方法 isaac'>>> f"{p}"'__str__ 方法 isaac'>>> p.__str__()'__str__ 方法 isaac'>>> p<demo.Person object at 0x10e0e3588>

此时我们发现在使用 print 打印对象、对象的格式化输出以及调用 str 方法,调用的都是 __str__方法。但在交互环境下,直接输出 对象的时候,没有调用 __str__ 方法,输出的结果仍然是 id 的结果。

2.2 重写 __repr__ 方法

# 定义 Person 类class Person(object):def __init__(self, name):self.name = namedef __str__(self):return "__str__ 方法 " + self.namedef __repr__(self):return "__repr__ 方法 " + self.namep = Person("isaac")

此时,我们再来看输出的结果,

>>> p__repr__ 方法isaac>>> p.__repr__()'__repr__ 方法isaac'>>> print(p)__str__ 方法 isaac

通过简单的对比,我们发现,在交互环境下,直接输出对象,调用的 __repr__ 方法。 另外还需要注意的是,如果将对象放在容器中进行输出,调用的是 __repr__ 方法。

>>> [p][__repr__ 方法 isaac]>>> (p)__repr__ 方法 isaac>>> {"1":p}{'1': __repr__ 方法 isaac}>>> print([p])[__repr__ 方法 isaac]

3. 总结

Python 中的 __str__ 和  __repr__方法都是用来显示的,即描述对象信息的。 1.  __str__的目标是可读性,或者说, __str__的结果是让人看的。主要用来打印,即 print 操作, 2.  __repr__的目标是准确性,或者说, __repr__的结果是让解释器用的。 __repr__用于交互模式下提示回应, 3. 如果没有重写 __str__方法,但重写了 __repr__方法时,所有调用 __str__的时机都会调用 __repr__方法。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69915785/viewspace-2670333/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: JVM的四种GC算法
请登录后发表评论 登录
全部评论
不知阁下听没听过 打造程序员黑马的黑马程序员?

注册时间:2019-05-10

  • 博文量
    32
  • 访问量
    18687