繁体   English   中英

Python __str__ 和列表

[英]Python __str__ and lists

在 Java 中,如果我调用List.toString() ,它将自动调用 List 内每个 object 上的toString()方法。 例如,如果我的列表包含对象o1o2o3list.toString()看起来像这样:

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

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

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

它看起来像这样:

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

我怎样才能让 python 为列表中的每个元素(或 dict )自动调用我的__str__() ) ?

在 python 列表上调用 string 会调用内部每个元素的__repr__方法。 对于某些项目, __str____repr__是相同的。 如果您想要这种行为,请执行以下操作:

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

您可以使用列表理解来生成一个新列表,其中每个项目 str() 都会自动生成:

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 )

根据您想使用该输出的目的,也许__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() 列表中包含的所有内容。

像这样的东西?

a = [1, 2 ,3]
[str(x) for x in a]
# ['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 

您可以使用格式。

    def __str__(self):
       return("my list is".format(self.list1))

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

__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] ”作为你的输出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM