В Python 2.x, супер принимает следующие случаиПочему python super не принимает только экземпляр?
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 примет (см. Understanding Python super() with __init__() methods)
super().__init__()
? Я вижу в этом магию, нарушая явное, лучше, чем неявный Дзен. Я бы счел более подходящимself.super().__init__()
.
Я предполагаю, что вы имели в виду класс B (A): и класс C (B): –
Однако вы правы. Он никогда не сможет вызывать A .__ init __() из B, потому что в методе B .__ init __() self будет иметь тип C, прямой супер которого B, а не A. Итак, B .__ init __() будет вызван снова. –
ах вы правы насчет опечатки, спасибо! И это становится еще сложнее в нескольких схемах наследования, я думаю, что могу найти ссылку на это. – u0b34a0f6ae