【问题标题】:Python: Implicit conversion of object to str?Python:将对象隐式转换为str?
【发布时间】:2015-11-14 06:21:34
【问题描述】:

给定以下代码

class A:
  def __init__(self ):
    self.b = B()

  def __repr__(self):
    #return "<A with {} inside>".format( self.b )
    #return "<A with " + repr(self.b) + " inside>"
    return "<A with " + self.b  + " inside>" # TypeError: Can't convert 'B' object to str implicitly

class B:
  def __repr__(self):
    return "<B>"

a = A()
print(a)

我想知道为什么在将 A 的 self.b“添加”到字符串时不调用 B 的 __repr__

【问题讨论】:

  • "three " + 3 失败的原因相同。有没有办法让对象表现为字符串?
  • 是的,显式将其转换为字符串,使用strrepr,或使用字符串格式:"&lt;A with {!r} inside&gt;".format(self.b)。 Python 是强类型,不会发生隐式转换。
  • 好的,所以没有像 Ruby 的运算符重载这样的事情(我脑子里有这个)。
  • 如果你使用 str.format 而不是连接字符串呢?
  • @handle 运算符覆盖是一件事——在这里工作不是一个好方法,但你可以做到这一点。它还依赖于您以特定顺序执行“添加”(或者更确切地说,您必须在“B”之后有一个字符串。所以,是的,这不是一个好主意。

标签: python string class types


【解决方案1】:

你可以使用 repr()

class A:
    def __init__(self):
        self.b = repr(B())

    def __repr__(self):
        return "<A with " + self.b + " inside>"


class B:
    def __repr__(self):
        return "<B>"

a = A()
print(repr(a))

它对我有用

【讨论】:

  • 这在技术上可能会产生所需的输出,但这意味着 self.b 只是设置为字符串而不是对象。
【解决方案2】:

连接不会导致self.b 被评估为字符串。您需要明确告诉 Python 将其强制转换为字符串。

你可以这样做:

return "<A with " + repr(self.b)  + " inside>"

但是使用str.format会更好。

return "<A with {} inside>".format(self.b)

然而,正如 jonrsharpe 指出的那样,它会首先尝试调用__str__(如果存在),为了使其专门使用__repr__,语法如下:{!r}

return "<A with {!r} inside>".format(self.b)

【讨论】:

    猜你喜欢
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多