Magic Method(2)、__repr__、__str__

本文通过实例详细介绍了Python中__str__和__repr__的区别和作用,解释了为何需要这两个魔术方法来描述实例对象,并引用了官方文档进行说明。__repr__通常用于调试,确保返回的字符串具有丰富的信息,而__str__则提供更方便的用户友好输出。在未定义__str__时,__repr__也会被用作实例的字符串表示。
摘要由CSDN通过智能技术生成

Magic Method
字符串表示
其他......
__repr__
__str__

一、先上例子,看这两个函数的输出

class test:
    pass
t=test()
t.__repr__() 
# '<__main__.test object at 0x0000017CDFC400A0>'
t
# <__main__.test at 0x17cdfc400a0>
test()
# <__main__.test at 0x17cdfc40460>
t.__str__()
#'<__main__.test object at 0x0000017CDFC400A0>'

1.1 重写__str__() 后:

class TestStr:
    def __str__(self):
        return '[Value: testStr]' 
    
ts = TestStr()
ts
#  <__main__.TestStr at 0x17cdfc49670>
ts.__str__()
# '[Value: testStr]'
ts.__repr__()
# '<__main__.TestStr object at 0x0000017CDFC49670>'

1.2 重写__repr__()后:

class TestRepr:
    def __repr__(self):
        return 'TestRepr'
    
tr=TestRepr()
tr
# TestRepr
tr.__repr__()
# 'TestRepr'
tr.__str__()
# 'TestRepr'

1.3 两个Magic方法都重写后:

class TestReprStr:
    def __repr__(self):
        return 'Repr'
    def __str__(self):
        return 'str'
    
trs=TestReprStr()
trs
# Repr
trs.__str__()
# 'str'
trs.__repr__()
# 'Repr'

二、看代码说话

看了上面几个例子,大概有点感觉了。

这俩Magic Methods 就是输出有关实例对象的相关信息。

2.1 不同的是:

  1. 只覆盖__repr__() 那么,__str__() 也会被覆盖。
  2. 只覆盖__str__() 那么,只覆盖__str__()
  3. 都覆盖,就都覆盖了。🙃

2.2 疑问,为什么要这两个magic methods来描述实例对象,一个不就够了吗?

我想了一秒钟,灵光一动,得出结论,我想不出

于是我想到了官方文档。

文档上说:

在这里插入图片描述
所谓的官方 字符串:怕不是这个吧:在这里插入图片描述


在这里插入图片描述
而这个函数是生成一个对象的 非正式的 字符串返回。

2.3 总结

根据官方文档:

  1. __repr__()通常被用于调试,因此确保其表示的内容包含丰富信息且无歧义是很重要的。”
  2. “内置类object 默认实现 会调用object.__repr__().”
  3. __str__()可以使用更方便或更准确的描述信息。
  4. “ 如果一个类定义了 __repr__() 但未定义 __str__(),则在需要该类的实例的“非正式”字符串表示时也会使用__repr__()。”

官方文档好官方,第四点其实就是说:只覆盖__repr__() 那么,__str__() 也会被覆盖。

网上的资源说的也很接地气,

  1. __str__是面向用户的,而__repr__面向程序员。
  2. 在Python中调用print()打印实例化对象, 会调用__str__()。如果__str__()中有返回值,就会打印其中的返回值。

参考:

  1. 《官方文档: 3.3. 特殊方法名称:object.repr(self)、object.str(self)¶》
  2. 知乎: [字符串表示:__repr__函数和__str__函数]

End

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

adingable

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

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

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

打赏作者

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

抵扣说明:

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

余额充值