В 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__()
довольно избыточно. Я принимаю проблемы совместимости с классами старого стиля или множественное наследование, но я хотел бы услышать Вашу точку.super().__init__()
? Я вижу, что вид волшебства в этом, нарушая явное лучше, чем неявная Дзэн. Я видел бы более соответствующий self.super().__init__()
. 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 это решается скрытой переменной, указывающей на класс метода).
Две связи с примерами супер- и множественного наследования:
Я не могу дать точный ответ, но читали ли вы 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.
.