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
相关产品推荐
相关产品推荐

