【问题标题】:Problems with `__str__` method in recursive list type objects递归列表类型对象中的 __str__ 方法的问题
【发布时间】:2013-03-31 23:53:58
【问题描述】:

我正在尝试制作一个基本上是列表的对象,但具有额外的功能。当我使用它(例如通过打印它)时,我想要一个自定义显示。例如:

class MyList(list):
    def __init__(self, name, arg):
        self.name=name
        super().__init__(arg)
    def __str__(self):
        return "{0}: {1}".format(self.name,self[:])
if __name__=="__main__":
    B = MyList("george",range(3))
    A = MyList("bernadett",range(5,0,-1))
    B.append(A)
    A.append(B)
    print(B)

打印出george: [0, 1, 2, [5, 4, 3, 2, 1, [0, 1, 2, [...]]]] 我希望它总是在进入列表之前打印 Mylist 的名称,我宁愿将递归深度限制为 1,而不是只打印名称并将其保留。

所以我想要类似:George: [0, 1, 2, Bernadette: [5, 4, 3, 2, 1, George:]]

此外,每当我尝试更改列表类型对象的 __repr__ 时,我都会遇到无限循环,我不知道为什么。

谢谢。

【问题讨论】:

  • 我认为你的问题可能是格式(self.name,self[:])。 self[:] 可能会导致您的程序调用列表的 str 方法而不是 MyList。看完我写的,觉得很可笑。但是,如果它对您有帮助,我还是想发布它
  • 感谢您的帮助,我认为调用切片的 str 会在每个项目上调用 str ......所以 str 用于前几个项目的整数,然后 str 用于最后一个 MyList队列中的项目,我认为这会解决它......但不是那么多。

标签: python list python-3.x


【解决方案1】:

使用父表示:

def __repr__(self):
    return "{0}: {1}".format(self.name, super().__repr__())

您必须将其定义为__repr__ 方法,因为在列表中它是用于打印其中元素的方法。

这样做,上面的代码将导致:

george: [0, 1, 2, bernadett: [5, 4, 3, 2, 1, george: [...]]]

【讨论】:

  • 嘿,成功了!谢谢。为什么我应该在这里使用 repr 而不是 str ?另外,我应该在 super() 中添加一个参数吗?超级(列表)还是什么?
  • 您需要__repr__,因为这是列表将调用内部元素的内容。对于 python 3,您可以不带参数调用 super。如果回答有帮助,您可以点击计票下方的“打勾”标记。
猜你喜欢
  • 1970-01-01
  • 2020-09-23
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
  • 2019-04-28
  • 2013-05-16
  • 1970-01-01
相关资源
最近更新 更多