__str__
有什么区别和 __repr__
在 Python 中?
最佳答案
Alex总结得很好,但令人惊讶的是,过于简洁。
首先,让我重申Alex’s post中的要点。 :
__repr__
目标是明确的__str__
目标是可读__str__
使用包含的对象 __repr__
__repr__
其作用如下:return "%s(%r)" % (self.__class__, self.__dict__)
__repr__
已定义,并且 __str__
不是,对象的行为就像 __str__=__repr__
.__repr__
这可用于理解对象。实现 __str__
是可选的:如果您需要“ pretty-print ”功能(例如,由报告生成器使用),请执行此操作。__repr__
的目标是明确的log(INFO, "I am in the weird function and a is", a, "and b is", b, "but I got a null C — using default", default_c)
eval(repr(c))==c
,这意味着您了解有关 c
的所有信息.如果这足够简单,至少以一种模糊的方式,那就去做吧。如果没有,请确保您有关于 c
的足够信息。反正。我通常使用类似 eval 的格式:"MyClass(this=%r,that=%r)" % (self.this,self.that)
.这并不意味着您实际上可以构造 MyClass,或者那些是正确的构造函数参数——但它是表达“这是您需要了解的关于此实例的一切”的一种有用形式。%r
以上,不是 %s
.你总是想用 repr()
[或 %r
格式化字符,相当于] 里面 __repr__
实现,或者你正在击败repr的目标。您希望能够区分MyClass(3)
和 MyClass("3")
.__str__
的目标是可读的str(3)==str("3")
.同样,如果你实现一个 IP 抽象,让它的 str 看起来像 192.168.1.1 就好了。在实现日期/时间抽象时,str 可以是“2010/4/12 15:35:22”等。目标是以用户而非程序员想要阅读的方式表示它。砍掉无用的数字,假装是其他类——只要它支持可读性,就是一种改进。__str__
使用包含的对象 __repr__
__str__
可读性如何? ?[moshe is, 3, hello
world, this is a list, oh I don't know, containing just 4 elements]
print "[" + ", ".join(l) + "]"
__repr__
对于您实现的任何类。这应该是第二天性。实现 __str__
如果您认为拥有一个在可读性方面出错的字符串版本会很有用。
https://stackoverflow.com/questions/1436703/