Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何在打印中递归应用str_Python - Fatal编程技术网

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"