当前位置: 首页 > 面试题库 >

如何在Python中继承和扩展列表对象?

萧奇
2023-03-14
问题内容

我对使用python list对象感兴趣,但功能略有改变。特别是,我希望列表是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

有任何想法吗?另外,如果您可以为此指出一个好的教程,那就太好了!

谢谢!


问题答案:

使用该super()函数调用基类的方法,或直接调用该方法:

class MyList(list):
    def __getitem__(self, key):
        return list.__getitem__(self, key-1)

要么

class MyList(list):
    def __getitem__(self, key):
        return super(MyList, self).__getitem__(key-1)

但是,这不会改变其他列表方法的行为。例如,索引保持不变,这可能导致意外结果:

numbers = MyList()
numbers.append("one")
numbers.append("two")

print numbers.index('one')
>>> 1

print numbers[numbers.index('one')]
>>> 'two'


 类似资料:
  • 我在下棋。我想做一个抽象的piece类,然后可以通过pawn/knight/rook/等进行扩展。假设我的piece类是这样的: 我希望Pawn具有相同的sayName功能,但我希望它具有不同的movePiece功能,因为Pawn有自己独特的移动方式。我怎么做典当,使它扩展件,并覆盖件的移动件功能?

  • 问题内容: 我刚刚有人问我一个问题。 问 -Java是否支持多重继承? 我 -不 问-Java中的每个类都扩展了类Object(类Object除外),如果我们从外部扩展了一个类,例如 那么你可以说A类扩展了B类和Object类,这意味着它是多重继承。那么怎么说Java不支持多重继承呢? 我 -实际上,类B扩展了类Object,因此,当你在类A中扩展类B时,类A间接扩展了类Object。这是多级继承

  • 我在挣扎。 当扩展一个类时,我可以很容易地向它添加一些新属性。 但是,当我扩展基类时,如果我想向基类的对象(简单对象的属性)添加新属性,该怎么办? 下面是一个带有一些代码的示例。 基类 派生类 现在,正如您可以从行内注释中看到的,这将激怒TypeScript。但这在JavaScript中工作。那么,实现这一目标的正确方法是什么呢?如果没有,问题是在我的代码模式本身吗?什么模式适合这个问题? 也许您

  • 问题内容: 我想向内置类型添加一些属性,所以我这样写: 但仅包含元素。为什么我在这里不工作?我应该如何从类似内置类型的继承?像这样的不可变类型是否相同? 问题答案: 该类型通常在其方法内进行列表的实际初始化,因为这是可变类型的约定。子类型化不可变类型时,只需要覆盖即可。虽然 可以在对列表进行子分类时覆盖,但对于您的用例而言,这样做没有多大意义。覆盖比较容易: 另请注意,在这种情况下,建议不要使用。

  • 问题内容: 我有一个收集类型: 我的对象中有一个列表: B在哪里延伸A 但我不能执行以下操作: 我不明白为什么,因为Collection是由List实现的。 问题答案: 让我们假设您可以做您描述的事情: 该方法调用看起来不错,因为它是一个包含s 的集合。但是,如果允许上述分配,那么我们会遇到一个问题,因为它实际上是对实例的引用-我只是将a 添加到只能容纳s 的列表中! 阿斯克还说: 我不明白为什么

  • 编组或取消编组对象 您可以将若干个对象合并到一个组中,把这些对象作为一个单元同时进行处理。这样,您就可以同时移动或变换若干个对象,且不会影响其属性或相对位置。例如,您可能想将徽标设计中的对象编成一组,以便将其作为一个单元进行移动和缩放。 编组对象被连续堆叠在图稿的同一图层上,位于组中最前端对象之后;因此,编组可能会更改对象的图层分布及其在给定图层上的堆叠顺序。如果您选择位于不同图层中的对象并将其编