所以我有以下功能:
def find_by_name(self, name):
fitting_list = [p for p in self.__persons if name.lower() in p.name.lower()]
return fitting_list
当我想要打印列表时,我得到以下输出:
[<src.store.domain.person.Person object at 0x000001F88705B128>]
为什么会发生这种情况,我该如何解决?
答案 0 :(得分:3)
这只是对象的__repr__
。 __repr__
意味着对象的机器可读表示,您可以通过覆盖它来更改它。
答案 1 :(得分:1)
list
并不关心您的班级是否有__str__
方法。
打印对象时,print
会在对象上调用str
以获取合适的字符串。 str
函数尝试调用对象的__str__
方法,但如果没有,则会调用对象的__repr__
方法。如果它们不是该对象的类定义中__repr__
的定义,那么您将获得从父类继承的那个,通常是来自基类{{1}的默认__repr__
。 } type。
object
以及list
,tuple
和set
等其他内置集合没有dict
方法,因此当您尝试将它们转换为字符串(显式地使用__str__
函数,或隐式地通过str
)调用它们的print
方法。而这些__repr__
方法又会对集合中的每个项目调用__repr__
。因此,当您将任何这些集合对象传递给repr
时,您将始终看到项目的print
。并且明确地在集合上调用__repr__
将没有任何区别。
如果您想查看str
或集合中项目的__str__
表示形式,则需要对集合进行迭代,并在每个项目上明确调用list
。
这是一个很小的代码片段(适用于Python 2&amp; 3),它说明了这些要点。
str
<强>输出强>
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__
时找不到__repr__
,将使用__str__
。
单独保留现有的str
方法并创建一个更加人性化的__str__
。但是,建议__repr__
向看到它的程序员显示有用的信息,如果__repr__
字符串可以复制&amp;粘贴到解释器或脚本中以重新创建对象。
单独保留现有__repr__
方法并创建一个调用__str__
的{{1}}。虽然有效,但这有点傻。相关策略是将__repr__
设置为引用__str__
的类属性。请参阅下面的示例。
__repr__