【问题标题】:printing __str__ of elements in a list打印列表中元素的 __str__
【发布时间】:2018-01-21 20:43:30
【问题描述】:

我了解到__str__ 可以定义对象字符串的输出。

例子:

class Person(object):
    def __init__(self, name):
        self.name = name
    def __str__(self):
        return self.name

p1 = Person('Steve Jobs')
p2 = Person('Bill Gates')
p3 = Person('Mark Zuckerberg')

print(p1)  # >>> Steve Jobs

它按照我的意愿输出Steve Jobs,而不是<__main__.Person object at 0x10410c588>

但是,如果我创建一个列表:

lst = [p1, p2, p3]
print(lst)
# >>> [<__main__.Person object at 0x1045433c8>, <__main__.Person object at 0x1045434e0>, <__main__.Person object at 0x104543550>]

我必须:

print([i.__str__() for i in lst])
# >>> ['Steve Jobs', 'Bill Gates', 'Mark Zuckerberg']

让它工作??

这没什么意义吧?

【问题讨论】:

  • 如果有帮助请看这里 - stackoverflow.com/questions/12448175/…
  • @AbhinavRisal 它有帮助。谢谢!
  • str(i) 是一种更好的拼写方式 i.__str__()
  • @埃里克谢谢!我有点强调__str__,但谢谢!

标签: python st


【解决方案1】:

list.__str__ 使用对象的__repr__ 来构建字符串。所以,只需将__repr__ 委托给__str__

In [1]: class Person(object):
   ...:     def __init__(self, name):
   ...:         self.name = name
   ...:     def __str__(self):
   ...:         return self.name
   ...:     def __repr__(self):
   ...:         return str(self)
   ...:
   ...: p1 = Person('Steve Jobs')
   ...: p2 = Person('Bill Gates')
   ...: p3 = Person('Mark Zuckerberg')
   ...:

In [2]: print(p1)
Steve Jobs

In [3]: lst = [p1, p2, p3]
   ...:

In [4]: print(lst)
[Steve Jobs, Bill Gates, Mark Zuckerberg]

编辑

如果您想遵守约定,请执行以下操作:

In [18]: class Person(object):
    ...:     def __init__(self, name):
    ...:         self.name = name
    ...:     def __str__(self):
    ...:         return self.name
    ...:     def __repr__(self):
    ...:         return f"{type(self).__name__}({self.name})"
    ...:

In [19]: p1 = Person('Steve Jobs')

In [20]: print([p1])
[Person(Steve Jobs)]

【讨论】:

  • 谢谢。据我了解,repr() 是在 python 中表示代码,以便eval(repr(i)) = i。那么对于任何python对象__str__ == __repr__在启动时是否默认创建?
  • 正确 - 从__repr__ 输出原始名称违反了约定。不过你可以输出Person('Steve Jobs'),那很好
  • @Code_Control_jxie0755 是的,通常你应该遵守这个约定。
  • 那么如果我通过__repr__ == __str__ 更改__repr__,这会导致eval(repr(i)) != i,并且会对更大的图景产生一些影响吗?
  • 请注意,__str__ = __repr__ 已经是对象的默认值,因此您只需定义 __repr__ 即可。 “将对更大的图景产生一些影响”-是的,由于输出变得模棱两可,您将使调试变得更加困难-如果某人的名字是"Hello, World"怎么办?现在你的名字列表看起来好像多了一个名字!
【解决方案2】:

考虑实施:

class Person(object):
    def __init__(self, name):
        self.name = name
    def __str__(self):
        return self.name
    def __repr__(self):
        return 'Person({!r})'.format(self.name)  # !r adds the quotes correctly

这给出了:

>>> lst
[Person('Steve Jobs'), Person('Bill Gates'), Person('Mark Zuckerberg')]

您看到不匹配行为的原因是 print 在其参数上调用 str(),但 list strrepr 是相同的,并且都在每个元素上调用 repr

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 2015-05-08
    • 2018-07-22
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多