Python:如何为MutableSequence派生类定义__new__?

时间:2012-03-23 14:33:13

标签: python inheritance object abstract-class

我正在尝试从collections.MutableSequence:

继承
class myList(MutableSequence):
   def __new__(cls,*kwargs):
      obj=MutableSequence.__new__(cls,*kwargs)
      return obj

我收到错误:

>>>a=myList()
>>>TypeError: Can't instantiate abstract class ContactMapList with abstract methods __delitem__, __getitem__, __len__, __setitem__, insert

当我以相同的方式直接从内置列表类派生我的类时,我没有遇到任何错误:

class myList(list):
   def __new__(cls,*kwargs):
      obj=list.__new__(cls,*kwargs)
      return obj

我试图找到为myList(MutableSequence)定义构造函数的方法,但运气不好:(

2 个答案:

答案 0 :(得分:2)

抽象基类是合同。这是一个承诺列表,任何类都必须保留它。

每个collections类所做的承诺列在the docs中。例如,从MutableSequence继承的任何内容都会包含__getitem____setitem____delitem__等等。

您无法实例化合同!


当您创建一个继承自抽象基类的类时,您不会继承这些方法。 (好吧......见下面的注释。)你继承了一堆“抽象方法”,它们只是占位符。为了履行您从ABC继承的承诺,您必须为这些方法提供定义。他们可以做任何你喜欢的事,但他们必须在那里。

实际上,您继承的方法可以是真正的方法,您可以使用super()委托给它们。这允许您指定默认行为。但这并不经常使用。

答案 1 :(得分:1)

您无法实例化抽象类;你可以实例化一个非抽象类。这回答了你的问题。

未回答的问题是:您为什么要首先定义__new__