2013-03-31 24 views
1

我试图使一个对象基本上是一个列表,但具有额外的功能。当我使用它(例如通过打印它)我想要一个自定义显示。例如:递归列表类型对象中`__str__`方法的问题

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__为列表类型的对象,我得到无限循环,我不知道为什么。

谢谢。

+0

我认为你的问题可能是格式(self.name,自[:])。 self [:]可能导致程序调用list的__str__方法而不是MyList。读完我写的内容后,听起来很荒谬。然而,如果有机会,它可以帮助我,无论如何 – Jake

+0

感谢您的帮助,我认为,调用切片的str,会在每个项目上调用str ...所以为前几个项目,然后str队列中的最后一个MyList项目,我想这会照顾它......但不是那么多。 – user2230408

回答

2

,使用父表示:

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

你必须定义以此为__repr__方法,因为名单是用来打印里面的元素之一。

做的是,将导致上面的代码中:

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

嘿它工作!谢谢。 为什么我应该在这里使用repr而不是str? 另外,我应该在super()中加入一个参数吗?超级(列表)什么的? – user2230408

+0

你需要'__repr__',因为这就是列表将在内部元素上调用的内容。对于python 3,你可以不带参数地调用'super'。如果答案有帮助,您可以点击投票计数下方的“打勾”标记。 – JBernardo