Python:如何在打印中递归应用str
在容器中打印用户定义的类实例时遇到一些问题。简而言之,如果我的代码是:Python:如何在打印中递归应用str,python,Python,在容器中打印用户定义的类实例时遇到一些问题。简而言之,如果我的代码是: class A(): def __str__(self): return 'abc' class B(): def __str__(self): return str(A()) a,b=A(),B() C=[[a],b] print(C) 然后输出应该是这样的:[[],],但我希望它递归地应用定制的\uu str\uuu,甚至可以在嵌套列表或类中工作,也就是说,我希望输出
class A():
def __str__(self):
return 'abc'
class B():
def __str__(self):
return str(A())
a,b=A(),B()
C=[[a],b]
print(C)
然后输出应该是这样的:
[[],]
,但我希望它递归地应用定制的\uu str\uuu
,甚至可以在嵌套列表或类中工作,也就是说,我希望输出是[['abc'],'abc']
。任何python方法都可以吗?您需要覆盖列表的\uuu str\uuu
方法,而不是A
或B
,因为递归需要从这里开始。也就是说,要将列表转换为字符串,需要递归地将列表中的每个对象转换为字符串。不幸的是,你不能这样做。最好是编写一个单独的函数,比如
def list_to_str(l):
if isinstance(l, list):
return "[%s]" % (", ".join(map(list_to_str, l)),)
else:
return "'%s'" % (str(l),)
print(list_to_str(C))
@Blckknight应该作为答案提交,因为这似乎是正确的答案(它适用于我非常类似的问题):
**覆盖repr(),而不是str()
为了完整性,您还可以添加此选项
defstr(自我):
返回自我。repr()
@如果你想重新提交作为分数的答案,你应该。我希望我可以只添加一条注释,但我没有这样做的名声。在B中,返回str(a())?问题是任何这样的递归都必须从list
开始,因为最终这就是使用print(C)转换为字符串的内容
。您没有在类中定义\uuuu repr\uuuu
有什么原因吗?这就是list.\uuuu str\uuuu
将调用的方法,而不是您定义的\uuu str\uuuu
方法。第一行中的print
应该是def
吗?@Blckknght,您介意接受这个答案吗?
def __repr__(self):
return "abc"