Почему Python супер не принимает только экземпляр?

В Python 2.x, супер принимает следующие случаи

class super(object)
 |  super(type) -> unbound super object
 |  super(type, obj) -> bound super object; requires isinstance(obj, type)
 |  super(type, type2) -> bound super object; requires issubclass(type2, type)
 |  Typical use to call a cooperative superclass method:

насколько я вижу, супер класс, перенося тип и (в конечном счете) экземпляр для разрешения суперкласса класса.

Я скорее озадачен несколькими вещами:

  • почему существует также нет super(instance), с типичным использованием, например. super(self).__init__(). Технически, можно получить тип объекта от самого объекта, таким образом, текущая стратегия super(ClassType, self).__init__() довольно избыточно. Я принимаю проблемы совместимости с классами старого стиля или множественное наследование, но я хотел бы услышать Вашу точку.
  • почему с другой стороны, python 3 примет (см. Понимание Python супер () с __ init __ () методы), super().__init__() ? Я вижу, что вид волшебства в этом, нарушая явное лучше, чем неявная Дзэн. Я видел бы более соответствующий self.super().__init__().

5
задан Community 23 May 2017 в 12:01
поделиться

2 ответа

super(ClassType, self).__init__() является не избыточным в кооперативной схеме множественного наследования -- ClassType не обязательно является типом self, а классом, из которого вы хотите сделать кооперативный вызов в __init__.

В иерархии классов C наследует B наследует A, в C.__init__ вы хотите вызвать init суперкласса с точки зрения C, и вы вызываете B. __init__; тогда в B.__init__ вы должны передать тип класса B в супер -- так как вы хотите разрешить вызов суперклассов B (а точнее, следующего в mro после B класса C).

class A (object):
  def __init__(self):
    pass

class B (A):
  def __init__(self):
    super(B, self).__init__()

class C (B):
  def __init__(self):
    super(C, self).__init__()

если вы сейчас инстанцируете c = C(), вы видите, что тип класса не избыточный -- super(self).__init__() внутри B.__init__ на самом деле не сработает! Что вы делаете, так это вручную указываете, в каком классе находится метод, вызывающий super (a в Python 3's Super это решается скрытой переменной, указывающей на класс метода).

Две связи с примерами супер- и множественного наследования:

6
ответ дан 14 December 2019 в 01:09
поделиться

Я не могу дать точный ответ, но читали ли вы PEP вокруг суперключевого слова? Я провел быстрый поиск в гугле, и там появились PEP 367 и PEP 3135.

http://www.python.org/dev/peps/pep-0367/

http://www.python.org/dev/peps/pep-3135/#numbering-note

В отличие от любого другого известного мне языка, в большинстве случаев ответы на причуды Питона можно найти в PEP's вместе с ясными рациональными и позиционными утверждениями.

Обновление:

Прочитав 3135, соответствующие письма в Python Mailing и ссылку на язык, вы понимаете, почему так происходит на Python 2 в сравнении с Python 3.

http://docs.python.org/library/functions.html?highlight=super#super

Я думаю, что супер был реализован, чтобы быть явно/недостаточно, чтобы быть на всякий случай и максимально упростить логику ( без сахара и глубокой логики, чтобы найти родителя). Так как super является встроенной функцией, она должна выводить правильный возврат из того, что предоставлено, не добавляя дополнительных сложностей в то, как структурированы объекты на Python.

PEP 3135 изменяет все, потому что он представил и выиграл аргумент для подхода DRY'er к super.

.
3
ответ дан 14 December 2019 в 01:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: