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__
。
【问题讨论】:
与"three " + 3
失败的原因相同。有没有办法让对象表现为字符串?
是的,显式将其转换为字符串,使用str
或repr
,或使用字符串格式:"<A with !r inside>".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?的主要内容,如果未能解决你的问题,请参考以下文章
Python3 错误:TypeError:无法将“字节”对象隐式转换为 str