Python: как определить __new__ для производного класса MutableSequence? - PullRequest
1 голос
/ 23 марта 2012

Я пытаюсь наследовать от коллекций.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), но безуспешно: (

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

Абстрактный базовый класс - это контракт . Это список обещаний, которые должен выполнять любой класс, производный от него.

Обещания каждого из collections классов перечислены в документах . Например, все, что наследуется от MutableSequence, будет иметь __getitem__, __setitem__, __delitem__ и некоторые другие.

Вы не можете создать экземпляр договора!


Когда вы создаете класс, который наследует от абстрактного базового класса, вы не наследуете методы. (Ну ... см. Примечание ниже.) Вы наследуете кучу «абстрактных методов», которые являются просто заполнителями. Чтобы выполнить обещание, которое вы дали, наследуя от ABC, вы должны дать определения для этих методов. Они могут делать все, что угодно, но они должны быть там.

На самом деле методы, которые вы наследуете, могут быть реальными методами, и вы можете делегировать их с помощью super(). Это позволяет вам указать поведение по умолчанию. Но это не часто используется.

1 голос
/ 23 марта 2012

Вы не можете создать экземпляр абстрактного класса;Вы можете создать экземпляр неабстрактного класса.Это отвечает на ваш вопрос.

Без ответа вопрос: почему вы в первую очередь определяете __new__?

...