【问题标题】:Python: how to define __new__ for MutableSequence derived class?Python:如何为 MutableSequence 派生类定义 __new__?
【发布时间】:2012-03-23 14:33:13
【问题描述】:

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

【问题讨论】:

  • 答案在问题中:Can't instantiate abstract class.
  • 请参阅this 答案,了解如何从 MutableSequence 继承的示例。

标签: python inheritance object abstract-class


【解决方案1】:

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

每个collections 类所做的承诺都列在the docs 中。例如,任何从MutableSequence 继承的东西都会有__getitem__、__setitem__、__delitem__ 等等。

你不能实例化合约!


当您创建一个从抽象基类继承的类时,您不会继承这些方法。 (嗯......请参阅下面的注释。)您继承了一堆“抽象方法”,它们只是占位符。为了履行您通过继承 ABC 所做的承诺,您必须为这些方法提供定义。他们可以为所欲为,但他们必须在那里。

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

【讨论】:

  • 事实上,你可以实例化一个合约。对于不知道您要传达的内容的人来说,这个答案可能毫无意义。
  • @Marcin You can, in fact, instantiate a contract. 在什么意义上?如何实例化一个抽象基类?
  • 采取标准形式的合同;填写它。你已经实例化了一个合约。
  • 我认为对“合同”这个词有误解。我说“合同 [是] 任何从它派生的类都必须遵守的承诺清单”。你不能创建一个承诺列表的实例!你必须——正如你所说——填写。这是关键的一步。
  • @Marcin 使用contract 来描述接口是标准的。参见例如the Java docs: Interfaces form a contract between the class and the outside world. 这准确地是一份合同:上面写着“我将实施thismethod 和thatmethod 和theothermethod。”
【解决方案2】:

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

悬而未决的问题是:你为什么要首先定义__new__?

【讨论】:

  • 那么为这个MutableSequence的派生类定义构造函数的过程是什么?请多多包涵,因为我对此很新 :)
  • @jmborr 为什么要定义构造函数? __init__ 怎么了?
  • 没什么,只是我的无知。不过,我开始理解我的错误信息。这意味着我必须重写提到的抽象方法,对吧?
  • @jmborr 简单的继承(加上一点点)就可以了。不过,实现 new 并不是简单的继承——它是入门级的魔法。
  • 我终于明白了!是的,我将不得不实现这些“虚拟”方法或使用“超级”。一百万感谢您的耐心和回答,Marcin。
猜你喜欢
  • 2023-03-03
  • 1970-01-01
  • 2018-05-09
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
相关资源
最近更新 更多