当前位置: 首页 > 后端技术 > Python

python中的魔术方法:__str__和__repr__

时间:2023-03-25 22:33:30 Python

1。简介在学习面向对象的时候,我们知道python中有一种特殊的方法,叫做magicmethod。该方法的特点如下:1.方法定义总是以两个下划线开始,以两个下划线结束:如__init__、__str__和__repr__2.这种方法一般不需要手动调用。它会在满足特定条件时自动调用。我们可以成为通话时间。学习2020年黑马程序员的python基础教程。Python中有两个神奇的方法用来描述对象信息,__str__和__repr__,那么为什么要定义这两个方法呢?其实他们设计的目的是不同的:1.__repr__的目标是准确性,或者说,__repr__的结果是供解释器使用的。2、__str__的目标是可读性,或者说,__str__的结果是给人看的。2、下面分析一下,仔细看看它们的用法:不重写__str__和__repr__,打印对象的输出结果不是很友好,是对象的内存地址,也就是id的结果。#定义Person类classPerson(object):def__init__(self,name):self.name=namep=Person("isaac")复制代码下面是测试输出的结果:>>>print(p)<__main__。Person对象位于0x10f29b940>>>>p<__main__。0x10f29b940>'复制代码输出的结果不是我们想要的结果。这时候,我们重写__str__和__repr__方法。2.1重写__str__方法#定义Person类classPerson(object):def__init__(self,name):self.name=namedef__str__(self):return"__str__method"+self.namep=Person("isaac")复制代码下面是测试结果:>>>print(p)__str__methodisaac>>>str(p)'__str__methodisaac'>>>f"{p}"'__str__methodisaac'>>>p.__str__()'__str__方法isaac'>>>p复制代码此时我们发现在使用print打印对象,格式化输出对象,调用str方法时,都是调用__str__方法。但是在交互环境下,直接输出对象时,并没有调用__str__方法,输出结果还是id的结果。2.2覆盖__repr__方法#定义Person类classPerson(object):def__init__(self,name):self.name=namedef__str__(self):return"__str__method"+self.namedef__repr__(self):return"__repr__method"+self.namep=Person("isaac")复制代码此时,我们再看一下输出,>>>p__repr__methodisaac>>>p.__repr__()'__repr__methodisaac'>>>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__的结果是给人看的。主要用于打印,即打印操作,2.__repr__的目标是准确性,或者说,__repr__的结果是供解释器使用的。__repr__用于交互模式下的快速响应。3、如果不重写__str__方法,而是重写__repr__方法,那么在调用__str__时会一直调用__repr__方法。