【问题标题】:How do I append an object class to a list?如何将对象类附加到列表中?
【发布时间】:2016-11-20 09:10:28
【问题描述】:

所以我有以下功能:

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

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

【问题讨论】:

  • 你期待什么?
  • 我希望打印关于 if 条件的对象列表。我已经实现了 str 方法。这还不够吗?
  • 就是这样。它打印一个包含一个 Person 对象的列表。您会看到 Python 打印对象的默认方式。
  • 顺便说一句,“persons”属性可能应该被称为.persons,或者如果你想表明它是一个私有名称供你的类的方法使用并且代码外部的代码可能应该称为._persons类不应该直接接触它。以双下划线开头(最多以单下划线结尾)的名称会调用 Python 的 name mangling 机制,并且仅应在您真正需要它时使用。如果你不得不问“我需要在这里修改名字吗?”,你可能不需要。 ;)

标签: python list class


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    list 不关心你的类是否有__str__ 方法。

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

    list 和其他内置集合如 tuplesetdict 没有 __str__ 方法,因此当您尝试将它们转换为字符串时(或者显式使用 @ 987654336@ 函数,或通过print 隐式调用)他们的__repr__ 方法被调用。而那些__repr__ 方法又在集合中的每个项目上调用repr。因此,当您将任何这些集合对象传递给print 时,您将始终看到项目的__repr__。并且明确地在集合上调用str 不会有任何区别。

    如果您想查看list 或集合中的项目的__str__ 表示,您需要遍历集合,在每个项目上显式调用str

    这里有一个小代码 sn-p(适用于 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__ 方法,并创建一个调用__str____repr__。虽然有效,但这有点愚蠢。一个相关的策略是将__repr__ 设置为引用__str__ 的类属性。请参阅下面的示例。

    class Test(object):
        def __str__(self):
            return 'Test str'
        __repr__ = __str__
    

    【讨论】:

    • 非常感谢。这让我比我找到的任何其他教程更了解 str 方法。
    猜你喜欢
    • 2015-11-14
    • 2021-12-10
    • 2022-01-22
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    相关资源
    最近更新 更多