题
我一直在读 repr
在Python。我想知道输出的应用是什么 repr
是。例如
class A:
pass
repr(A) ='<class __main__.A at 0x6f570>'
b=A()
repr(b) = '<__main__.A instance at 0x74d78>'
什么时候感兴趣 '<class __main__.A at 0x6f570>'
或者'<__main__.A instance at 0x74d78>'
?
解决方案
有时您必须处理或 提出字节字符串 如
bob2='bob\xf0\xa4\xad\xa2'
如果您将其打印出来(在Ubuntu中),您会得到
In [62]: print(bob2)
bob𤭢
这对尝试理解您的字节字符串的其他人并不是很有帮助。在评论中,约翰指出,在窗户中, print(bob2)
导致类似 bobð¤¢
. 。问题在于Python检测终端/控制台的默认编码,并试图根据该编码来解码字节字符串。由于Ubuntu和Windows使用不同的默认编码(可能 utf-8
和 cp1252
分别),随后发生了不同的结果。
相反,字符串的重复是明确的:
In [63]: print(repr(bob2))
'bob\xf0\xa4\xad\xa2'
当人们在此处发布有关Python字符串的问题时,经常要求他们显示字符串的重复,以便我们确定他们正在处理什么串。
通常,reper应该是对象的明确字符串表示。 repr(obj)
调用对象 obj
' __repr__
方法。因为在您的示例中 A
没有自己的 __repr__
方法, repr(b)
诉诸指示类和内存地址。
你可以覆盖 __repr__
提供更多相关信息的方法。
在您的示例中 '<__main__.A instance at 0x74d78>'
告诉我们两个有用的事情:
- 那
b
是类的实例A
在里面__main__
名称空间, - 并且该对象位于地址0x74d78的内存中。
例如,您可能有两个课程实例 A
. 。如果它们具有相同的内存地址,那么您会知道它们正在“指向”同一基础对象。 (请注意此信息也可以使用 id
).
其他提示
理论上, repr(obj)
应该吐出一根绳子,以便可以喂入 eval
重新创建对象。换句话说,
obj2 = eval(repr(obj1))
应该复制物体。
在实践中, repr
通常是一个“精简版”版本 str
. str
可能会打印物体的可读形式,而 repr
打印出诸如对象类之类的信息,通常用于调试目的。但是,有用性在很大程度上取决于您的情况以及所讨论的对象如何处理 repr
.
主要目的 repr()
是在交互式解释器和调试器中用于以人类可读形式格式化对象。您给出的示例主要对调试目的有用。