Python:将对象隐式转换为str?

Posted

技术标签:

【中文标题】Python:将对象隐式转换为str?【英文标题】:Python: Implicit conversion of object to 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__

https://docs.python.org/3/reference/datamodel.html#object.repr https://docs.python.org/3/reference/lexical_analysis.html#operators

【问题讨论】:

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

【讨论】:

以上是关于Python:将对象隐式转换为str?的主要内容,如果未能解决你的问题,请参考以下文章

Python:将对象隐式转换为str?

Python3 错误:TypeError:无法将“字节”对象隐式转换为 str

Tensorflow TypeError:无法将'numpy.int64'对象隐式转换为str

Java除了数字类型的自动隐式类型转换,对类有类似功能么?

将一个元素元组(int)转换为str

JavaScript:隐式类型转换