我正在尝试从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)定义构造函数的方法,但运气不好:(
答案 0 :(得分:2)
抽象基类是合同。这是一个承诺列表,任何类都必须保留它。
每个collections
类所做的承诺列在the docs中。例如,从MutableSequence
继承的任何内容都会包含__getitem__
,__setitem__
,__delitem__
等等。
您无法实例化合同!
当您创建一个继承自抽象基类的类时,您不会继承这些方法。 (好吧......见下面的注释。)你继承了一堆“抽象方法”,它们只是占位符。为了履行您从ABC继承的承诺,您必须为这些方法提供定义。他们可以做任何你喜欢的事,但他们必须在那里。
实际上,您继承的方法可以是真正的方法,您可以使用super()
委托给它们。这允许您指定默认行为。但这并不经常使用。
答案 1 :(得分:1)
您无法实例化抽象类;你可以实例化一个非抽象类。这回答了你的问题。
未回答的问题是:您为什么要首先定义__new__
?