如何修改Python中类实例列表的print输出内容?
让自定义类实例列表的打印输出更友好
这个问题我太熟悉啦!Python里自定义类的实例默认打印出来就是类名加内存地址,这对我们理解列表内容完全没用对吧?别担心,只需要给你的MyClass加上一个特殊方法就能轻松解决~
为什么默认输出是内存地址?
Python中所有类都继承自object类,而object自带的__repr__方法就是返回类似<__main__.MyClass at 0x...>的字符串——这是Python对对象的默认“官方表示”,但对我们来说一点不直观。当你打印列表A时,Python会逐个调用列表中每个元素的__repr__方法,所以就出现了你看到的一堆内存地址。
解决方案:定义__repr__方法
我们只需要在MyClass里重写__repr__方法,返回一个能体现实例特征的字符串就行。这个方法会在打印对象(或者包含对象的列表)时被自动调用。
示例代码
class MyClass: def __init__(self, i): self.i = i # 重写__repr__方法,自定义实例的字符串表示 def __repr__(self): # 这里我们返回包含实例i值的清晰描述 return f"MyClass(i={self.i})" # 创建实例列表 A = [MyClass(i) for i in range(10)] # 现在打印列表看看效果 print(A)
输出效果
运行上面的代码,你会得到这样的输出:
[MyClass(i=0), MyClass(i=1), MyClass(i=2), MyClass(i=3), MyClass(i=4), MyClass(i=5), MyClass(i=6), MyClass(i=7), MyClass(i=8), MyClass(i=9)]
是不是一下子就清晰多了?
额外小知识:__repr__ vs __str__
可能你还会看到__str__方法,这里简单区分一下:
__repr__是对象的官方/正式表示,应该尽可能清晰且具备可重现性(比如能通过这个字符串重建对象最好),主要给开发者看,列表、字典等容器打印时会调用元素的__repr__。__str__是对象的友好表示,更偏向给普通用户看,直接print(单个实例)时会调用它。
如果需要的话,你可以同时定义这两个方法,比如:
class MyClass: def __init__(self, i): self.i = i def __repr__(self): return f"MyClass(i={self.i})" def __str__(self): return f"这是一个MyClass实例,它的i值是{self.i}"
这样,print(MyClass(5))会输出友好的用户描述,而print(A)还是会用__repr__的正式表示,兼顾两种场景~
内容的提问来源于stack exchange,提问作者Matheus Popst de Campos
相关产品推荐
相关产品推荐

