【发布时间】:2010-11-04 00:54:56
【问题描述】:
我对使用 python 列表对象感兴趣,但功能略有改变。特别是,我希望列表为 1 索引而不是 0 索引。例如:
>> mylist = MyList()
>> mylist.extend([1,2,3,4,5])
>> print mylist[1]
输出应该是:1
但是当我更改 __getitem__() 和 __setitem__() 方法来执行此操作时,我收到了 RuntimeError: maximum recursion depth exceeded 错误。我对这些方法进行了很多修改,但这基本上就是我所拥有的:
class MyList(list):
def __getitem__(self, key):
return self[key-1]
def __setitem__(self, key, item):
self[key-1] = item
我猜问题是self[key-1] 本身调用了它定义的相同方法。如果是这样,我如何使它使用list() 方法而不是MyList() 方法?我尝试使用super[key-1] 而不是self[key-1] 但这导致投诉TypeError: 'type' object is unsubscriptable
有什么想法吗?另外,如果您能指出一个很好的教程,那就太好了!
谢谢!
【问题讨论】:
-
这明显违反了里氏替换原则。如果您实际上不能在任何需要
list的地方实际使用它,那么子类化list可能没有太多价值。在这种情况下,组合可能是更合适的策略? -
不太明白; “组成”是什么意思?另外,我们如何确定不能用 MyList 代替标准列表?有什么好的方法可以告诉吗?比如内部方法使用
__getitem__和__setitem__会不会有问题? -
mindthief: en.wikipedia.org/wiki/Composition_over_inheritance -- 如果您更改
list的现有界面(即,正是您在这里要求的),那么您不能用MyList代替list。即使像x[0]这样的基本内容也不起作用。
标签: python list inheritance