我正在尝试从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)定义构造函数,但没有运气:(

最佳答案

抽象基类是合同。这是所有源自它的类都必须遵守的承诺清单。

每个collections类做出的承诺在the docs中列出。例如,从MutableSequence继承的任何内容都将具有__getitem____setitem____delitem__等。

您无法实例化合同!



当您创建从抽象基类继承的类时,您不会继承这些方法。 (嗯,请参阅下面的注释。)您继承了一堆只是占位符的“抽象方法”。为了实现您从ABC继承而来的承诺,您必须为这些方法提供定义。他们可以做任何您想做的事,但必须在那里。

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

07-28 06:53