【问题标题】:is there a way to define a recursive __repr__ for a class that contains itself?有没有办法为包含自身的类定义递归 __repr__ ?
【发布时间】:2020-08-26 01:21:45
【问题描述】:

假设我有一堂课:

class Band():
    def __init__(self, name, members):
        self.name = name
        self.members = members

    def __repr__(self):
        return f'''{self.name} [{', '.join(self.members)}]'''

如果我像这样创建它的两个实例:

Band_A = Band('Band A', ['Tom', 'Josh'])
Band_B = Band('Band B', ['Mark', 'Steve'])

当我打印它们时,我得到了预期的结果:

Band A [Tom, Josh]
Band B [Mark, Steve]

但是当我创建一个包含自身的类的实例时,它就不起作用了。

Band_C = Band('Band C', [Band_A, Band_B])

我收到此错误:

Traceback (most recent call last):
  File "c:/Users/IcyTear/Desktop/test.py", line 16, in <module>
    print(Band_C)
  File "c:/Users/IcyTear/Desktop/test.py", line 7, in __repr__
    return f'''{self.name} [{', '.join(self.members)}]'''
TypeError: sequence item 0: expected str instance, Band found

有没有办法让它工作以显示这个?

Band C [Band A [Tom, Josh], Band B [Mark, Steve]]

【问题讨论】:

  • ', '.join 期望它的参数是 strings 的可迭代
  • 你必须加入会员的repr()s。

标签: python repr


【解决方案1】:

将您的 __repr__(self) 更改为

def __repr__(self):
    return f'''{self.name} [{', '.join(map(repr, self.members))}]'''

得到

Band C [Band A [Tom, Josh], Band B [Mark, Steve]]

str.join() 想要一个可迭代的字符串,因此使用 map(repr, ...) 将每个 member 显式转换为其字符串表示

【讨论】:

    猜你喜欢
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    相关资源
    最近更新 更多