Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将对象类附加到列表中?_Python_List_Class - Fatal编程技术网

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

Python 如何将对象类附加到列表中?,python,list,class,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>] [] 为什么会发生这种情况

所以我有以下功能:

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

为什么会发生这种情况?我如何修复它?

这只是对象的
\uu repr\uu
\uuuu repr\uuuu
是对象的机器可读表示形式,您可以通过覆盖它来更改它。

这只是对象的
\uuu repr\uu
\uuuu repr\uuuu
是对象的机器可读表示形式,您可以通过覆盖它来更改它。

列表
不关心您的类是否有
\uuu str\uu
方法

打印对象时,
print
调用对象上的
str
,以获取合适的字符串。
str
函数尝试调用对象的
\uuuuu str
方法,但如果没有方法,则调用对象的
\uuuu repr\uuu
方法。如果它们在该对象的类定义中不是
\uuuuuu repr\uuuuu
的定义,那么您将获得从父类继承的定义,通常是从基本
对象
类型继承的默认
\uuuuuu repr\uuu

list
和其他内置集合,如
tuple
set
dict
没有
\uuuu str\uuuu
方法,因此当您尝试将它们转换为字符串时(显式使用
str
函数,或隐式通过
print
),会调用它们的
\uu repr\uu
方法。而那些
\uuuu repr\uuuu
方法依次调用集合中每个项目的
repr
。因此,当您将这些集合对象中的任何一个传递到
打印
时,您将始终看到项目的
\uuuu repr\uuu
。对集合显式地调用
str
,也不会有什么不同

如果要查看
列表
或集合中项目的
\uuuu str\uuuu
表示,则需要迭代集合,对每个项目显式调用
str

下面是一个很小的代码片段(适用于Python2&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
因此,如果您希望能够将对象列表打印为单个实体,并使对象的字符串更人性化,您有两个选择:

  • \uuu str\uu
    方法的名称更改为
    \uu repr\uu
    。这是最简单的方法,正如我前面所说的,如果在对象传递到
    str
    时找不到
    \uuuuuuuuuuuuuu
    时,将使用
    \uuuu repr\uuuuuu

  • 保留现有的
    \uuu str\uu
    方法,创建一个更人性化的
    \uuu repr\uu
    。但是,有人建议
    \uuuu repr\uuuu
    向看到它的程序员显示有用的信息,如果可行的话,最好将
    \uuuu repr\uuu
    字符串复制粘贴到解释器或脚本中以重新创建对象

  • 保留现有的
    \uuuu str\uuuu
    方法,并创建一个调用
    \uuuu str\uuuu
    \uuuu repr\uuuu
    。虽然有效,但这有点愚蠢。一个相关的策略是将
    \uuuu repr\uuu
    设置为引用
    \uuu str\uuu
    的类属性。请参见下面的示例


  • list
    不关心您的类是否有
    \uuuu str\uuu
    方法

    打印对象时,
    print
    调用对象上的
    str
    ,以获取合适的字符串。
    str
    函数尝试调用对象的
    \uuuuu str
    方法,但如果没有方法,则调用对象的
    \uuuu repr\uuu
    方法。如果它们在该对象的类定义中不是
    \uuuuuu repr\uuuuu
    的定义,那么您将获得从父类继承的定义,通常是从基本
    对象
    类型继承的默认
    \uuuuuu repr\uuu

    list
    和其他内置集合,如
    tuple
    set
    dict
    没有
    \uuuu str\uuuu
    方法,因此当您尝试将它们转换为字符串时(显式使用
    str
    函数,或隐式通过
    print
    ),会调用它们的
    \uu repr\uu
    方法。而那些
    \uuuu repr\uuuu
    方法依次调用集合中每个项目的
    repr
    。因此,当您将这些集合对象中的任何一个传递到
    打印
    时,您将始终看到项目的
    \uuuu repr\uuu
    。对集合显式地调用
    str
    ,也不会有什么不同

    如果要查看
    列表
    或集合中项目的
    \uuuu str\uuuu
    表示,则需要迭代集合,对每个项目显式调用
    str

    下面是一个很小的代码片段(适用于Python2&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
    
    因此,如果您希望能够将对象列表打印为单个实体,并使对象的字符串更人性化,您有两个选择:

  • \uuu str\uu
    方法的名称更改为
    \uu repr\uu
    。这是最简单的方法,正如我前面所说的,如果在对象传递到
    str
    时找不到
    \uuuuuuuuuuuuuu
    时,将使用
    \uuuu repr\uuuuuu

  • 保留现有的
    \uuu str\uu
    方法,创建一个更人性化的
    \uuu repr\uu
    。但是,有人建议
    \uuuu repr\uuuu
    向看到它的程序员显示有用的信息,如果可行的话,最好将
    \uuuu repr\uuu
    字符串复制粘贴到解释器或脚本中以重新创建对象

  • 保留现有的
    \uuuu str\uuuu
    方法,并创建一个调用
    \uuuu str\uuuu
    \uuuu repr\uuuu
    。虽然有效,但这有点愚蠢。一个相关的策略是设置