技术|python 中的魔法方法,厉害了!

黑马程序员视频库

播妞QQ号:3077485083

传智播客旗下互联网资讯、学习资源免费分享平台

在学习面向对象的时候,我们知道在 python 中有一类特殊的方法,叫做魔法方法,这种方法的特点如下:

1. 方法定义的时候以两个下划线开头和两个下划线结尾:如__init__、__str__和__repr__ 

2. 这类方法一般不需要我们手动调用,在满足某个条件的时候会自动调用,这个满足的条件我们可以成为调用时机。

在Python 中有两个魔法方法都是用来描述对象信息的,__str__和__repr__,那为什么要定义两个这样的方法呢,其实是他们设计的目的是不一样的:

1. __repr__的目标是准确性,或者说,__repr__的结果是让解释器用的。

2. __str__的目标是可读性,或者说,__str__的结果是让人看的。


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

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

p = 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__方法。

重写__str__ 方法

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


def __str__(self):
return "__str__ 方法 " + self.name




p = Person("isaac")

以下为测试结果:

>>> print(p)
__str__ 方法 isaac
>>> str(p)
'__str__ 方法 isaac'
>>> f"{p}"
'__str__ 方法 isaac'
>>> p.__str__()
'__str__ 方法 isaac'
>>> p

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

重写__repr__ 方法

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


def __str__(self):
return "__str__ 方法 " + self.name


def __repr__(self):
return "__repr__ 方法 " + self.name




p = 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]

总结:

Python 中的__str__ 和 __repr__方法都是用来显示的,即描述对象信息的。1. __str__的目标是可读性,或者说,__str__的结果是让人看的。主要用来打印,即 print 操作, 

2. __repr__的目标是准确性,或者说,__repr__的结果是让解释器用的。__repr__用于交互模式下提示回应, 

3. 如果没有重写__str__方法,但重写了__repr__方法时,所有调用__str__的时机都会调用__repr__方法。

 前沿资讯/干货料/免费课程 

尽在黑马程序员视频库

????????????

END

- 推荐阅读 -

200行代码,10大知识点,3天做游戏!让你“爽爽爽”的学习利器!

2020-07-28

技术|python 中的魔法方法,厉害了!_第1张图片

扒一扒国内外最火开发语言“上位”史!升职加薪很靠谱!

2020-07-23

跳槽首选,平均薪资2w+!现在入门快人一步

2020-07-21

月薪19k还招不到人?HR:这锅我不背!

2020-07-16

我就知道你“在看”

你可能感兴趣的:(技术|python 中的魔法方法,厉害了!)