网友问题:
Python 有什么区别?__str__
__repr__
网友回答:
我的经验法则是:面向开发人员,面向客户。__repr__
__str__
网友回答:
除非您特别采取行动以确保其他情况,否则大多数类都没有有用的结果:
>>> class Sic(object): pass
...
>>> print(str(Sic()))
<__main__.Sic object at 0x8b7d0>
>>> print(repr(Sic()))
<__main__.Sic object at 0x8b7d0>
>>>
As you see — no difference, and no info beyond the class and object’s . If you only override one of the two…:id
>>> class Sic(object):
... def __repr__(self): return 'foo'
...
>>> print(str(Sic()))
foo
>>> print(repr(Sic()))
foo
>>> class Sic(object):
... def __str__(self): return 'foo'
...
>>> print(str(Sic()))
foo
>>> print(repr(Sic()))
<__main__.Sic object at 0x2617f0>
>>>
如您所见,如果您覆盖 ,那也用于 ,但反之亦然。__repr__
__str__
其他需要了解的关键花絮:在内置容器上使用 ,而不是 ,用于它包含的项目。而且,尽管在典型的文档中发现了关于该主题的文字,但几乎没有人费心使对象成为可用于构建相等对象的字符串(这太难了,并且不知道相关模块实际上是如何导入的,实际上是不可能的)。__str__
__repr__
__str__
__repr__
eval
所以,我的建议是:专注于使人类可读的合理性,并尽可能明确,即使这会干扰模糊的无法实现的目标,即使使 的返回值可以作为输入!__str__
__repr__
__repr__
__eval__
网友回答:
亚历克斯总结得很好,但令人惊讶的是,它太简洁了。
首先,让我重申一下亚历克斯帖子中的要点:
__repr__
目标是明确__str__
目标是可读性__str__
__repr__
默认实现无用
这主要是一个惊喜,因为Python的默认值往往相当有用。但是,在这种情况下,具有默认值将如下所示:__repr__
return "%s(%r)" % (self.__class__, self.__dict__)
会太危险了(例如,如果对象相互引用,则太容易进入无限递归)。所以Python应付了。请注意,有一个默认值为 true:如果已定义,则未定义,则对象的行为将好像 .__repr__
__str__
__str__=__repr__
这意味着,简单来说:几乎每个你实现的对象都应该有一个可用于理解对象的函数。实现是可选的:如果您需要“漂亮的打印”功能(例如,由报告生成器使用),请执行此操作。__repr__
__str__
__repr__
的目标是明确
让我直截了当地说出来——我不相信调试器。我真的不知道如何使用任何调试器,也从未认真使用过调试器。此外,我相信调试器的最大错误是它们的基本性质——我调试的大多数故障都发生在很久以前,在一个遥远的星系中。这意味着我确实相信,带着宗教热情,伐木。日志记录是任何体面的即发即弃服务器系统的命脉。Python 使记录变得容易:也许使用一些特定于项目的包装器,您只需要一个
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)
但是你必须做最后一步——确保你实现的每个对象都有一个有用的 repr,这样这样的代码就可以工作了。这就是为什么会出现“eval”的事情:如果你有足够的信息,这意味着你知道所有需要知道的事情。如果这很容易,至少以一种模糊的方式,去做吧。如果没有,请确保您有足够的信息。我通常使用类似 eval 的格式:。这并不意味着你实际上可以构造 MyClass,或者这些是正确的构造函数参数——但它是一种有用的形式来表达“这是你需要知道的关于这个实例的一切”。eval(repr(c))==c
c
c
"MyClass(this=%r,that=%r)" % (self.this,self.that)
注意:我在上面使用了,而不是.你总是想在实现中使用[或格式化字符,等效地],否则你就违背了repr的目标。您希望能够区分和 .%r
%s
repr()
%r
__repr__
MyClass(3)
MyClass("3")
__str__
的目标是可读性
具体来说,它并不打算是明确的 — 请注意。同样,如果你实现了一个IP抽象,让它的str看起来像192.168.1.1就好了。实现日期/时间抽象时,str 可以是“2010/4/12 15:35:22”等。目标是以用户(而不是程序员)想要阅读它的方式表示它。砍掉无用的数字,假装是其他类——只要它支持可读性,它就是一种改进。str(3)==str("3")
容器的__str__
使用包含对象的__repr__
这似乎令人惊讶,不是吗?它有点,但如果它使用他们的?__str__
[moshe is, 3, hello
world, this is a list, oh I don't know, containing just 4 elements]
不是很。具体来说,容器中的字符串会发现太容易干扰其字符串表示。面对模棱两可,请记住,Python会抵制猜测的诱惑。如果您希望在打印列表时出现上述行为,只需
print("[" + ", ".join(l) + "]")
(您可能还可以弄清楚如何处理字典。
总结
实现任何你实现的类。这应该是第二天性。如果您认为拥有一个在可读性方面出错的字符串版本会很有用,请实现。__repr__
__str__
模板简介:该模板名称为【在Python里__str__和__repr__有什么区别?】,大小是暂无信息,文档格式为.html,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Python】栏目查找您需要的精美模板。