Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何为MutableSequence派生类定义新的?_Python_Inheritance_Object_Abstract Class - Fatal编程技术网

Python:如何为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

我正在尝试从集合继承。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)定义构造函数的方法,但运气不好:(

你不能实例化抽象类;你可以实例化非抽象类。这回答了你的问题


未回答的问题是:为什么首先要定义
\uuu new\uuu

抽象基类是一个契约。它是任何从它派生的类都必须遵守的承诺列表

每个
集合
类所做的承诺都列在中。例如,从
可变序列
继承的任何内容都将包含
\uuuu getitem\uuuuuuuuuu
\uuuuuuuuu setitem\uuuuuuuuuuuuuu

你不能实例化合同


当您创建一个从抽象基类继承的类时,您不会继承方法。(好吧……请参见下面的注释。)您继承了一堆“抽象方法”这些只是占位符。为了履行您从ABC继承而来的承诺,您必须为这些方法给出定义。它们可以做任何您喜欢的事情,但它们必须存在


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

答案在问题中:
无法实例化抽象类
。有关如何从MutableSequence继承的示例,请参阅答案。那么为该MutableSequence的派生类定义构造函数的过程是什么?请耐心等待,因为我我对此很陌生:)@jmbor为什么要定义构造函数?
\uuuu init\uuuu
怎么了?没什么,只是我的无知。不过,我开始理解我的错误消息。这意味着我必须重写上面提到的抽象方法,对吗?@jmborrsimpleinheritation(加上一点)就可以了。实现新的不是简单的继承,而是入门级的魔法。我终于明白了!是的,我必须实现这些“虚拟”方法或使用“超级”。非常感谢你的耐心和回答,Marcin。事实上,你可以实例化一份合同。对于那些不知道你想要表达什么的人来说,这个答案可能毫无意义。@Marcin
事实上,你可以实例化一个合同。
在什么意义上?如何实例化一个抽象基类;填上它。你列举了一份合同,我认为对“合同”这个词有误解。我说“合同是任何阶级必须遵守的承诺清单”。你不能列举一个承诺的例子!你必须——正如你所说的——填写它。这是使用
contract
描述接口的关键步骤,这是标准的。参见示例:
接口在类和外部世界之间形成契约。
它正是一个契约:它说“我将实现
这个方法
那个方法
热方法