文章目录
一、先上例子,看这两个函数的输出
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 不同的是:
- 只覆盖
__repr__()
那么,__str__()
也会被覆盖。 - 只覆盖
__str__()
那么,只覆盖__str__()
。 - 都覆盖,就都覆盖了。🙃
2.2 疑问,为什么要这两个magic methods
来描述实例对象,一个不就够了吗?
我想了一秒钟,灵光一动,得出结论,我想不出
于是我想到了官方文档。
文档上说:
所谓的官方 字符串:怕不是这个吧:
而这个函数是生成一个对象的非正式的
字符串返回。
2.3 总结
根据官方文档:
- “
__repr__()
通常被用于调试,因此确保其表示的内容包含丰富信息且无歧义是很重要的。” - “内置类object 默认实现 会调用
object.__repr__()
.” - “
__str__()
可以使用更方便或更准确的描述信息。” - “ 如果一个类定义了
__repr__()
但未定义__str__()
,则在需要该类的实例的“非正式”字符串表示时也会使用__repr__()
。”
官方文档好官方,第四点其实就是说:只覆盖
__repr__()
那么,__str__()
也会被覆盖。
网上的资源说的也很接地气,
__str__
是面向用户的,而__repr__
面向程序员。- 在Python中调用
print()
打印实例化对象, 会调用__str__()
。如果__str__()
中有返回值,就会打印其中的返回值。
参考:
End