如何在Python中打印对象列表时应用__str__函数

54 投票
3 回答
30507 浏览
提问于 2025-04-16 03:14

这个互动的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

试试这个:

class Test:
   def __repr__(self):
       return 'asd'

还有,看看这个 文档链接

撰写回答