如何在Python中打印对象列表时应用__str__函数
这个互动的Python控制台代码片段会告诉你一切:
>>> class Test:
... def __str__(self):
... return 'asd'
...
>>> t = Test()
>>> print(t)
asd
>>> l = [Test(), Test(), Test()]
>>> print(l)
[__main__.Test instance at 0x00CBC1E8, __main__.Test instance at 0x00CBC260,
__main__.Test instance at 0x00CBC238]
简单来说,我希望当我打印这个列表的时候,能看到三次asd
这个字符串。我也试过用pprint
,但结果是一样的。
3 个回答
3
你需要创建一个 __repr__
方法:
>>> class Test:
def __str__(self):
return 'asd'
def __repr__(self):
return 'zxcv'
>>> [Test(), Test()]
[zxcv, zxcv]
>>> print _
[zxcv, zxcv]
可以参考这个 文档:
object.__repr__(self)
这个方法会被内置的
repr()
函数调用,也会在字符串转换时使用(就是用反引号包起来的那种),目的是计算一个对象的“官方”字符串表示。如果可能的话,这个字符串应该看起来像一个有效的 Python 表达式,能够用来重新创建一个值相同的对象(在合适的环境下)。如果做不到这一点,应该返回一个形如<...一些有用的描述...>
的字符串。返回的值必须是一个字符串对象。如果一个类定义了__repr__()
但没有定义__str__()
,那么在需要这个类实例的“非正式”字符串表示时,也会使用__repr__()
。这个方法通常用于调试,所以它的表示方式要信息丰富且不含糊。
13
其他回答中提到的实现 __repr__
是一种可行的办法。如果因为某些原因(比如已有的类型,或者 __repr__
需要用于其他目的,而不仅仅是为了好看)不能这样做,那你可以直接使用
print [str(x) for x in l]
或者,正如一些人可能会建议的,使用 map(str, l)
(这个方法稍微简洁一点)。
56