Python:如何为MutableSequence派生类定义新的?
我正在尝试从集合继承。MutableSequence:Python:如何为MutableSequence派生类定义新的?,python,inheritance,object,abstract-class,Python,Inheritance,Object,Abstract Class,我正在尝试从集合继承。MutableSequence: class myList(MutableSequence): def __new__(cls,*kwargs): obj=MutableSequence.__new__(cls,*kwargs) return obj 我得到一个错误: >>>a=myList() >>>TypeError: Can't instantiate abstract class ContactMa
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)定义构造函数的方法,但运气不好:(你不能实例化抽象类;你可以实例化非抽象类。这回答了你的问题
未回答的问题是:为什么首先要定义
\uuu new\uuu
?抽象基类是一个契约。它是任何从它派生的类都必须遵守的承诺列表
每个集合
类所做的承诺都列在中。例如,从可变序列
继承的任何内容都将包含\uuuu getitem\uuuuuuuuuu
、\uuuuuuuuu setitem\uuuuuuuuuuuuuu
等
你不能实例化合同
当您创建一个从抽象基类继承的类时,您不会继承方法。(好吧……请参见下面的注释。)您继承了一堆“抽象方法”这些只是占位符。为了履行您从ABC继承而来的承诺,您必须为这些方法给出定义。它们可以做任何您喜欢的事情,但它们必须存在
实际上,您继承的方法可以是真正的方法,您可以使用
super()委托给它们
。这允许您指定默认行为。但这并不常用。答案在问题中:无法实例化抽象类
。有关如何从MutableSequence继承的示例,请参阅答案。那么为该MutableSequence的派生类定义构造函数的过程是什么?请耐心等待,因为我我对此很陌生:)@jmbor为什么要定义构造函数?\uuuu init\uuuu
怎么了?没什么,只是我的无知。不过,我开始理解我的错误消息。这意味着我必须重写上面提到的抽象方法,对吗?@jmborrsimpleinheritation(加上一点)就可以了。实现新的不是简单的继承,而是入门级的魔法。我终于明白了!是的,我必须实现这些“虚拟”方法或使用“超级”。非常感谢你的耐心和回答,Marcin。事实上,你可以实例化一份合同。对于那些不知道你想要表达什么的人来说,这个答案可能毫无意义。@Marcin事实上,你可以实例化一个合同。
在什么意义上?如何实例化一个抽象基类;填上它。你列举了一份合同,我认为对“合同”这个词有误解。我说“合同是任何阶级必须遵守的承诺清单”。你不能列举一个承诺的例子!你必须——正如你所说的——填写它。这是使用contract
描述接口的关键步骤,这是标准的。参见示例:接口在类和外部世界之间形成契约。
它正是一个契约:它说“我将实现这个方法
和那个方法
和热方法
”