list
不在乎你的班级有__str__
方法。
当您打印对象时,print
在对象上调用str
以获取合适的字符串。 str
函数尝试调用该对象的方法__str__
,但如果它不具有一个一个,则它会调用该对象的__repr__
方法。如果它们不是__repr__
在该对象的类定义中的定义,那么您将从父类中继承该定义,通常这将是基类object
类型的默认__repr__
。
list
和其他内置样tuple
,set
和dict
藏品没有__str__
方法,所以当你试图将它们转换为字符串(显式使用str
功能,或隐式的通过print
)他们__repr__
方法被调用。而这些方法又将repr
称为集合中的每个项目。因此,当您将这些集合对象中的任何一个传递给print
时,您将始终看到这些项目的__repr__
。并明确呼吁收集str
将没有区别。
如果要查看list
或集合中项目的__str__
表示形式,您需要遍历集合,在每个项目上明确调用str
。
这里有一个很小的代码片段(适用于Python 2 & 3),它说明了这些要点。
from __future__ import print_function
class Test(object):
def __str__(self):
return 'Test str'
def __repr__(self):
return 'Test repr'
a = [Test(), Test()]
print(id(a.__repr__), id(a.__str__))
print(a, str(a), repr(a))
for u in a:
print(u, str(u), repr(u))
输出
3075508812 3075508812
[Test repr, Test repr] [Test repr, Test repr] [Test repr, Test repr]
Test str Test str Test repr
Test str Test str Test repr
所以,如果你想成为能够打印对象的列表作为一个单一的实体,有对象的字符串更加人性化,你有几个选择:
更改您的__str__
方法__repr__
的名称。这是最简单的方法,正如我之前所说的,如果在对象被传递给str
时找不到__str__
,将使用__repr__
。
离开现有的__str__
方法,并创建一个更友好的__repr__
。然而,建议__repr__
向看到它的程序员显示有用的信息,如果__repr__
字符串可以复制&粘贴到解释器或脚本中以重新创建对象,那么实际上它很好。
单独保留现有的__str__
方法,并创建一个__repr__
,调用__str__
。虽然有效,但这有点愚蠢。相关策略是将__repr__
设置为引用__str__
的类属性。见下面的例子。
你有什么期望呢? –
我希望打印与if条件相关的对象列表。我已经实现了__str__方法。这应该不够吗? – Binary
就是这样。它用一个Person对象打印一个列表。你会看到Python打印对象的默认方式。 –