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
。虽然有效,但这有点愚蠢。一个相关的策略是设置