【发布时间】:2021-04-17 01:59:13
【问题描述】:
__str__ 可以返回任何我灵魂渴望的东西吗?
__str__ 上的文档指出:
[...] 对象的“非正式”或可打印的字符串表示
应该如何解读?
- A.只要我认为它代表对象,它就可以返回任何东西。
- 乙。它应该返回对象的明确表示,尽管它可以按我喜欢的任何方式进行格式化。
A 示例:
class Vehicle:
def __init__(self, owner):
self.owner = owner
self.wheels = 4
def __str__(self):
return "%s with %s wheels" % (self.owner, self.wheels)
print(Vehicle('Benjamin'))
>>> Benjamin with 4 wheels
B 示例:
class Vehicle:
def __init__(self, owner):
self.owner = owner
self.wheels = 4
def __str__(self):
return "Vehicle, owner is %s, with %s wheels" % (self.owner, self.wheels)
print(Vehicle('Benjamin'))
>>> Vehicle, owner is Benjamin, with 4 wheels
我发现的几乎所有资源(1、2、3、4、5、6)都表明输出 - 虽然它可以是非正式的 - 应该是明确和明确的(这是有道理的:Explicit is better than implicit., Readability counts. In the face of ambiguity, refuse the temptation to guess.)。
但是,鉴于文档中的“非正式”一词,有一些建议实际上可能是模棱两可和隐含的(1、2)。我发现一位开发人员表示可以使用__str__ 中对象的任何表示,而__repr__ 用于明确和明确的表示。我想了解他们的观点,但找不到任何支持他们的理由。您能否建议应该如何解释该文档并支持您的推理?
【问题讨论】:
-
__repr__应返回可用于重新构造完全相同的对象的有效文字。__str__可以是您想要的任何东西,但显然最好与您的对象有关。您不应将__str__与用于更复杂格式的单独模板混淆;您可能希望在许多不同的情况下使用您的对象,因此在其__str__方法中硬编码一种模板并不太有用。 -
感谢您的回答!您能否提供一些来源或扩展您说“
__str__可以是您想要的任何东西”背后的逻辑?文档似乎没有这样说——恰恰相反,它应该是对象的表示(不是说它“应该最好与它有关”)——这就是为什么我想知道一个人怎么会说它可以是“你想要的任何东西” -
文档很清楚
__str__可以返回任何你认为合适的东西(只要它是一个字符串)。请注意,即使__repr__的文档被认为是“更严格”的版本,也不是非常严格,它说明了“如果可能的话”之类的内容。不要想太多。 -
感谢您的想法 Juanpa 并鼓励不要过度考虑这一点,但文档说明的情况恰恰相反,不是吗? “对象的表示”并不完全是“您认为合适的任何东西”。查看动词“代表”的定义可以清楚地表明,并非所有事情都可以,但返回的字符串需要符合特定的假设。如果我从
Vehicle.__str__返回'MyObject',那会是正确的实现吗?
标签: python oop object debugging logging