如何将对象类附加到列表?

时间:2016-11-20 09:10:28

标签: python list class

所以我有以下功能:

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>]

为什么会发生这种情况,我该如何解决?

2 个答案:

答案 0 :(得分:3)

这只是对象的__repr____repr__意味着对象的机器可读表示,您可以通过覆盖它来更改它。

答案 1 :(得分:1)

list并不关心您的班级是否有__str__方法。

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

object以及listtupleset等其他内置集合没有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))

因此,如果您希望能够将对象列表打印为单个实体并使对象的字符串更加人性化,那么您有几个选择:

  1. 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__

    < / LI>
  2. 单独保留现有的str方法并创建一个更加人性化的__str__。但是,建议__repr__向看到它的程序员显示有用的信息,如果__repr__字符串可以复制&amp;粘贴到解释器或脚本中以重新创建对象。

  3. 单独保留现有__repr__方法并创建一个调用__str__的{​​{1}}。虽然有效,但这有点傻。相关策略是将__repr__设置为引用__str__的类属性。请参阅下面的示例。

  4. __repr__