Python__ str__ 和列表

在 Java 中,如果我调用 List.toString(),它将自动调用 List 中每个对象的 toString()方法。例如,如果我的列表包含对象 o1o2o3,那么 list.toString()应该是这样的:

"[" + o1.toString() + ", " + o2.toString() + ", " + o3.toString() + "]"

有没有办法在 Python 中获得类似的行为?我在我的类中实现了一个 __str__()方法,但是当我打印出一个对象列表时,使用:

print 'my list is %s'%(list)

它看起来像这样:

[<__main__.cell instance at 0x2a955e95f0>, <__main__.cell instance at 0x2a955e9638>, <__main__.cell instance at 0x2a955e9680>]

如何让 python 为列表中的每个元素自动调用我的 __str__()(或者就此而言,使用 dict) ?

110995 次浏览

在 python 列表上调用字符串将调用内部每个元素上的 __repr__方法。对于某些项目,__str____repr__是相同的。如果你想要这样的行为,那就去做:

def __str__(self):
...
def __repr__(self):
return self.__str__()

您可以使用 列表内涵自动生成每个 str ()’d 条目的新列表:

print([str(item) for item in mylist])

两件简单的事情你可以做,使用 map函数或使用理解。

但是这会给你一个字符串列表,而不是一个字符串。所以你还得把弦连在一起。

s= ",".join( map( str, myList ) )

或者

s= ",".join( [ str(element) for element in myList ] )

然后可以打印这个复合字符串对象。

print 'my list is %s'%( s )

像这样吗?

a = [1, 2 ,3]
[str(x) for x in a]
# ['1', '2', '3']

根据您希望使用该输出的目的,也许 __repr__更合适:

import unittest


class A(object):
def __init__(self, val):
self.val = val


def __repr__(self):
return repr(self.val)


class Test(unittest.TestCase):
def testMain(self):
l = [A('a'), A('b')]
self.assertEqual(repr(l), "['a', 'b']")


if __name__ == '__main__':
unittest.main()

我同意前面关于使用列表理解来完成这项工作的回答,但是您当然可以将其隐藏在一个函数后面,如果这就是您想要的东西的话。

def is_list(value):
if type(value) in (list, tuple): return True
return False


def list_str(value):
if not is_list(value): return str(value)
return [list_str(v) for v in value]

只是为了好玩,我使 list _ str ()递归地 str ()列表中包含的所有内容。

您得到的输出只是对象的模块名称、类名称,然后是以十六进制表示的内存地址,因为 __repr__函数没有被覆盖。

使用 print 时,__str__用于对象的字符串表示形式。但是,由于您打印的是一个对象列表,并且没有对该列表进行迭代以调用每个项的 str方法,因此它会打印出对象表示形式。

要调用 __str__函数,您需要执行以下操作:

'my list is %s' % [str(x) for x in myList]

如果你覆盖了 __repr__函数,你可以像以前一样使用 print 方法:

class cell:
def __init__(self, id):
self.id = id
def __str__(self):
return str(self.id) # Or whatever
def __repr__(self):
return str(self) # function invoked when you try and print the whole list.


myList = [cell(1), cell(2), cell(3)]
'my list is %s' % myList

然后您将得到“ my list is [1, 2, 3]”作为您的输出。

这样就够了。

当打印列表和其他容器类时,包含的元素将使用 __repr__打印,因为 __repr__用于内部对象表示。 如果我们打电话给 help(object.__repr__)它会告诉我们:

Help on wrapper_descriptor:


__repr__(self, /)
Return repr(self).

如果我们调用 help(repr),它会输出:

Help on built-in function repr in module builtins:


repr(obj, /)
Return the canonical string representation of the object.


For many object types, including most builtins, eval(repr(obj)) == obj.

如果 __str__是为一个对象实现的,而 __repr__不是 repr(obj)将输出默认输出,就像没有实现这些输出时的 print(obj)一样。

因此,唯一的方法就是为你的类实现 __repr__:

class C:
def __str__(self):
return str(f"{self.__class__.__name__} class str ")


C.__repr__=C.__str__
ci = C()




print(ci)       #C class str
print(str(ci))  #C class str
print(repr(ci)) #C class str