加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_开封站长网 (http://www.0378zz.com/)- 科技、AI行业应用、媒体智能、低代码、办公协同!
当前位置: 首页 > 教程 > 正文

Python中__str__和__repr__的达成

发布时间:2021-12-05 17:28:50 所属栏目:教程 来源:互联网
导读:Python有一个内置的函数叫repr,它能把一个对象用字符串的形式表达出来以便辨认,这就是字符串表示形式。repr就是通过__repr__这个特殊方法来得到一个对象的字符串表示形式。如果没有实现__repr__,当我们再控制台里打印一个变量的实例时,得到的字符串可能会
Python有一个内置的函数叫repr,它能把一个对象用字符串的形式表达出来以便辨认,这就是“字符串表示形式”。repr就是通过__repr__这个特殊方法来得到一个对象的字符串表示形式。如果没有实现__repr__,当我们再控制台里打印一个变量的实例时,得到的字符串可能会是<__main__.Object at 0x14af07dbe80>,这个表示的是打印的对象,以及对象的内存地址
 
现在让我们看看__str__和__repr__这两个方法有什么区别
 
首先定义一个类
 
class Vector:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y
 
    def __str__(self):
        return 'str Vector(%s, %s)' % (self.x, self.y)
 
然后我们在控制台上打印这个类的对象实例
 
>>> Vector(1, 2)
<__main__.Vector at 0x14af07dbe80>
>>> str(Vector(1, 2))
'str Vector(1, 2)'
>>> print(Vector(1, 2))
str Vector(1, 2)
 
从上面的例子我们可以看到,当把变量的实例输入到控制台,会打印出对象的类型和对象的地址,当把对象作为参数传给str或者print方法,则会调用对象的__str__方法
 
现在,我们删除原来的__str__方法,加上__repr__方法,再在控制台做一样的操作,看看会有什么不同
 
 class Vector:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y
   
    def __repr__(self):
        return 'repr Vector(%s, %s)' % (self.x, self.y)
 
重复之前打印Vector对象操作
 
>>> Vector(1, 2)
repr Vector(1, 2)
>>> str(Vector(1, 2))
'repr Vector(1, 2)'
>>> print(Vector(1, 2))
repr Vector(1, 2)
 
我们可以看到,实现我们没有实现__str__方法,但在调用str()的时候,str()会自动调用__repr__方法,并且在控制台输入对象实例的时候,出来的不再是对象类型和内存地址,而是打印我们所希望表达的对象信息
 
最后,我们在Vector类中加上__str__和__repr__方法
 
 class Vector:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y
 
    def __str__(self):
        return 'str Vector(%s, %s)' % (self.x, self.y)
   
    def __repr__(self):
        return 'repr Vector(%s, %s)' % (self.x, self.y)
 
重复之前的操作
 
>>> Vector(1, 2)
repr Vector(1, 2)
>>> str(Vector(1, 2))
'str Vector(1, 2)'
>>> print(Vector(1, 2))
str Vector(1, 2)
 
可以知道,当把对象作为参数传入print()时,会自动调用对象的__str__方法,但是当__str__方法不存在时,则会调用__repr__方法。所以,如果你只想实现这两个特殊方法中的一个,建议还是选择__repr__方法。

(编辑:开发网_开封站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读