python中__str__和__repr__的区别
一、简介
str()
内置函数使用 __str__
显示对象的字符串表示形式,而 repr()
内置函数使用 __repr__
显示对象,__str__
是面向用户而言,而__repr__
是面向程序员,直接在终端打印信息方便调试。
两者的区别在于:
repr()是便于开发者理解的方式返回对象的字符串表示形式。
str()以便于用户理解的方式返回对象的字符串表示形式。
我们要通过实现__repr__和__str__来为repr()和str()提供支持。
二、详解
预备知识:如果当一个类没有继承的父类的时候,那么这个类是默认继承object类的,object类已经定义了自己的__str__
和__repr__
方法
举一个例子:
class User(object):
def __init__(self, name):
self.name = name
J = User('Jack')
print(J)
J
如果我们直接打印一个类的实例化对象,或者是直接在终端中调用这个对象,都会显示其在内存内的地址,所有并没又显示一些比较友好的信息,对于调试来说不方便
那么接下来我们定义一下__repr__
方法看看有什么变化
class User_repr(User):
def __repr__(self):
return 'User Name:{}'.format(self.name)
A = User_repr('Alex')
print(A)
A
User Name:Alex
User Name:Alex
我们重写了__repr__
方法,让它返回一个字符串,便于查看信息,然后无论我们是直接打印还是在终端中调用,都会返回我们__repr__
方法所定义的结果。
那么接下来我们再重写一下__str__
方法看看有什么变化
class User_str(User):
def __str__(self):
return "Your Name:{}".format(self.name)
E = User_str('Eric')
print(E)
E
Your Name:Eric
<__main__.User_str at 0x24677d03b80>
这时出现了变化,当我们直接打印实例化对象的时候,我们获得了我们期望获得是字符串,然而当我们在终端中执行实例化对象的时候,我们获得的确实该对象在内存中的地址。
那么接下来我们同时定义__str__
和__repr__
方法看看有什么变化
class User_str_repr(User):
def __str__(self):
return 'Your Name:{}'.format(self.name)
def __repr__(self):
return 'User Name:{}'.format(self.name)
S = User_str_repr('Shum')
print(S)
S
Your Name:Shum
User Name:Shum
这时也出现了不同,当我们直接打印实例化对象的时候,调用的是__str__
方法的返回结果,当我们在终端中调用实例化对象的时候,得到确实__repr__
方法的返回结果
三、小结
总结:
__repr__
和__str__
这两个方法都是用于显示的,__str__
是面向用户的,而__repr__
面向程序员。实际上__str__
只是覆盖了__repr__
以得到更友好的用户显示。- 当我们进行打印的时候,先从
__str__
方法开始寻找,如果没有重写__str__
方法,那么再去查看是否重写了__repr__
方法,如果__repr__
方法被重写了,那么打印的结果就是__repr__
方法的结果 __str__
用于为最终用户创建输出,而__repr__
主要用于调试和开发。__repr__
的目标是明确无误,__str__
是可读的
四、Reference
https://docs.python.org/3/reference/datamodel.html#object.repr
https://docs.python.org/3/reference/datamodel.html#object.str
https://zhuanlan.zhihu.com/p/42730827
https://blog.csdn.net/sinat_38682860/article/details/102897192?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164250669316780264028345%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=164250669316780264028345&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allbaidu_landing_v2~default-4-102897192.first_rank_v2_pc_rank_v29&utm_term=python+repr&spm=1018.2226.3001.4187