2016-11-20 46 views
1

所以我有以下功能:如何将对象类附加到列表中?

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

你有什么期望呢? –

+0

我希望打印与if条件相关的对象列表。我已经实现了__str__方法。这应该不够吗? – Binary

+0

就是这样。它用一个Person对象打印一个列表。你会看到Python打印对象的默认方式。 –

回答

1

list不在乎你的班级有__str__方法。

当您打印对象时,print在对象上调用str以获取合适的字符串。 str函数尝试调用该对象的方法__str__,但如果它不具有一个一个,则它会调用该对象的__repr__方法。如果它们不是__repr__在该对象的类定义中的定义,那么您将从父类中继承该定义,通常这将是基类object类型的默认__repr__

list和其他内置样tuplesetdict藏品没有__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 

所以,如果你想成为能够打印对象的列表作为一个单一的实体,有对象的字符串更加人性化,你有几个选择:

  1. 更改您的__str__方法__repr__的名称。这是最简单的方法,正如我之前所说的,如果在对象被传递给str时找不到__str__,将使用__repr__

  2. 离开现有的__str__方法,并创建一个更友好的__repr__。然而,建议__repr__向看到它的程序员显示有用的信息,如果__repr__字符串可以复制&粘贴到解释器或脚本中以重新创建对象,那么实际上它很好。

  3. 单独保留现有的__str__方法,并创建一个__repr__,调用__str__。虽然有效,但这有点愚蠢。相关策略是将__repr__设置为引用__str__的类属性。见下面的例子。

​​
+0

非常感谢。这使我明白__str__方法比我发现的任何其他教程都好。 – Binary

3

这只是对象的__repr____repr__旨在成为对象的机器可读表示,您可以通过过滤来更改它。

相关问题