You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python集合中自定义对象的__str__方法未被调用,如何适配所有集合打印?

问题原因

打印Python容器类型(列表、元组、集合、嵌套容器等)时,容器内部会调用每个元素的__repr__方法生成输出字符串,而非__str__方法。你仅为Node类实现了__str__,因此单独打印节点正常,放入容器后打印就会输出默认的对象内存地址。

解决方案

方案1:修改自定义类,新增__repr__实现(最优通用方案)

直接将类的__repr__指向已实现的__str__即可,修改后所有容器打印该类实例时都会按预期输出内容,支持任意嵌套的集合类型。
修改后的代码示例:

class Node(object):
    def __init__(self, val=0):
        self.val = val
        self.left = None
        self.right = None

    def __str__(self):
        return str(self.val)
    # 新增这一行即可
    __repr__ = __str__

a = Node(1)
b = Node(2)
c = Node(3)

d = [a, b, c]
e = [[a], [b, c]]
print("a: {}\nd: {}\ne: {}".format(a, d, e))

运行后输出:

a: 1
d: [1, 2, 3]
e: [[1], [2, 3]]

方案2:不修改类,打印前手动转换集合内容

如果不方便调整类的定义,可以写一个通用的递归转换函数,处理任意深度、任意类型的集合,将其中的Node实例转为字符串后再打印:

def format_collection(obj):
    if isinstance(obj, Node):
        return str(obj)
    # 处理列表、元组
    if isinstance(obj, (list, tuple)):
        return type(obj)(format_collection(item) for item in obj)
    # 处理集合
    if isinstance(obj, set):
        return {format_collection(item) for item in obj}
    # 处理字典(如有需要)
    if isinstance(obj, dict):
        return {format_collection(k): format_collection(v) for k,v in obj.items()}
    return obj

# 打印时调用转换函数
print("d: {}\ne: {}".format(format_collection(d), format_collection(e)))

内容的提问来源于stack exchange,提问作者michael fortanely

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 09:45:03