【发布时间】:2014-08-20 17:41:44
【问题描述】:
我正在尝试重载 [] 运算符以使列表像循环列表一样工作。
class circularList(list):
def __init__(self, *args):
list.__init__(self,args)
def __getitem__(self, key):
return list.__getitem__(self, key%self.length)
def __setitem__(self, key, value):
return list.__setitem__(self, key%self.length, value)
在 sage 终端中运行此代码时,我收到以下错误:
TypeError: Error when calling the metaclass bases
list() takes at most 1 argument (3 given)
sage: def __getitem__(self, key):
....: return list.__getitem__(self, key%self.length)
....:
sage: def __setitem__(self, key, value):
....: return list.__setitem__(self, key%self.length, value)
这将按如下方式使用:
circle = circularlist([1,2,3,4])
有没有人碰巧知道我做错了什么?
【问题讨论】:
-
如何调用你的构造函数(即
circularList(...))? -
定义类时出现此错误,我将更新帖子。
-
你甚至根本不需要
__init__,首先。超类__init__可以很好地解决问题,因为您不再添加任何属性。 -
他确实需要
__init__,因为他将参数列表转换为列表项(这意味着您可以将任意数量的项传递给构造函数,而不必将可迭代的类似传递给list) -
您使用
circularList的方式最终会创建一个类似于[[1, 2, 3, 4]]的列表,因为您在构造函数中使用了参数列表。要么不需要*(在这种情况下,您可以删除构造函数,请参阅@TheSoundDefense 的评论),或者您真的想将其称为circularList(1, 2, 3, 4)以创建类似[1, 2, 3, 4]的列表
标签: python constructor overloading sage