Python中__str__和__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__方法。

  

原文地址:https://www.cnblogs.com/beiluowuzheng/p/8448162.html

时间: 2024-07-29 00:44:03

Python中__str__和__repr__的区别的相关文章

python进阶五(定制类)【5-1 python中__str__和__repr__】

python中 __str__和__repr__ 如果要把一个类的实例变成 str,就需要实现特殊方法__str__(): 1 class Person(object): 2 def __init__(self, name, gender): 3 self.name = name 4 self.gender = gender 5 def __str__(self): 6 return '(Person: %s, %s)' % (self.name, self.gender) 现在,在交互式命令行

python中__str__与__repr__

(1)背景 python中,对于类(自定义类)的实例对象的默认显示既没有太大用处,也不美观.比如: 1 class adder: 2 def __init__(self,value=0): 3 self.data=value #初始化数据 4 def __add__(self,other): 5 self.data+=other 6>>> x=adder()7>>>print(x) <__main__.adder. object at 0x.....> 8&

python中 __str__和__repr__

如果要把一个类的实例变成 str,就需要实现特殊方法__str__(): class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender def __str__(self): return '(Person: %s, %s)' % (self.name, self.gender) 现在,在交互式命令行下用 print 试试: 但是,如果直接敲变量 p: 似乎__str__(

Python中str()和repr()的区别

Python中str()和repr()的区别 区别 其实用处就是最大的区别了:str()主要用来为终端用户输出一些信息,而repr()主要用来调试:同时后者的目标是为了消除一些歧义(例如浮点数的精度问题),前者主要为了可读. 使用 In [12]: s = 'abc' In [13]: print(str(s)) abc In [14]: print(2.0/11) 0.18181818181818182 In [15]: repr(s) Out[15]: "'abc'" In [16

Python中type与Object的区别

Python中type与Object的区别 在查看了Python的API后,总算明白了.现在总结如下: 先来看object的说明: Python中关于object的说明很少,甚至只有一句话: class object The most base type 从介绍上看这也是Python对类型统一做出的努力.所以这里的object与Java的Object类有着异曲同工之妙,而且可以推测这个object很可能就是一个定义了一个类型的"空类" 再来看type的说明: class type(ob

FAQ:Python中*args和**agrs的区别

python提供了两种特别的方法来定义函数的参数: 1. 位置参数 *args,  把参数收集到一个元组中,作为变量args   >>>def show_args(*args):          #定义函数 print args >>>show_agrs("hello", "world")      #调用函数 输出:("hello","world") 2. 关键字参数 **kwargs,

python中linspace()和arange()的区别

python中linspace()和arange()的区别 今天无意间看到linspace(0,4,5)可以产生一个array([0,1,2,3,4])的数组,不知道里面的参数是什么,于是就有了这篇博文. linspace( ) linspace()通过指定开始值.终值和元素个数创建表示等差数列的一维数组,可以通过endpoint参数指定是否包含终值,默认值为True,即包含终值.看如下例子 arange( ) arange()通过指定开始值.终值(不包含终值)和步长创建表示等差数列的一维数组,

python中split()和split(&#39; &#39;)的区别

总结:split()的时候,多个空格当成一个空格:split(' ')的时候,多个空格也要分割,会分割出来空. 例1: 牛客网:牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,"student. a am I".后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是"I am a student.".Cat对一一的翻转这些单词顺序可

Python中浅拷贝和深拷贝的区别

Python中浅拷贝和深拷贝的区别 浅拷贝和深拷贝示意图 如上图,简单点说 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deepcopy 深拷贝 拷贝对象及其子对象 数字,字符串是不可变类型 列表,字典是可变类型 我们看下面的案例 案例一:浅拷贝 >>> import copy     #导入copy模块                >>> s=['name',['savings',100.0]] #赋值给s >