In Python 2.x, super accetta i seguenti casiPerché python super non accetta solo l'istanza?
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:
per quanto vedo, super è una classe, avvolgendo il tipo e (eventualmente) l'istanza di risolvere la superclasse di una classe.
Sono piuttosto perplesso da un paio di cose:
- perché non c'è inoltre
super(instance)
, con utilizzo tipico esempiosuper(self).__init__()
. Tecnicamente, è possibile ottenere il tipo di oggetto dall'oggetto stesso, quindi la strategia correntesuper(ClassType, self).__init__()
è ridondante. Presumo problemi di compatibilità con classi vecchio stile o eredità multipla, ma mi piacerebbe sentire il tuo punto. - perché, d'altra parte, python 3 accetterà (vedi Understanding Python super() with __init__() methods)
super().__init__()
? Vedo un po 'di magia in questo, violando l'esplicito è meglio dello Zen implicito. Avrei visto più appropriatoself.super().__init__()
.
Immagino tu intenda la classe B (A): e la classe C (B): –
Tuttavia, hai ragione. Non sarebbe mai in grado di chiamare A .__ init __() da B, perché nel metodo B .__ init __() self sarebbe di tipo C, il cui super diretto è B, non A. Quindi B .__ init __() verrebbe richiamato. –
ah hai ragione riguardo l'errore di battitura, grazie! E questo diventa ancora più complicato in molteplici schemi di ereditarietà, penso di poter trovare un link al riguardo. – u0b34a0f6ae