python中__str__和__repr__的区别

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

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值