Errore dell'ordine di risoluzione del metodo
-
12-12-2019 - |
Domanda
Questa è più di una questione di curiosità, piuttosto che un problema serio:
Stavo giocando con più eredità e venne accrostando questo:
>>> class A(object):
... def __init__(self): print "A.__init__() called"
...
>>> class B(object, A): pass
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Cannot create consisten method resolution
order (MRO) for bases object, A
.
Ottengo un TypeError
.Tuttavia, quando invertivo l'ordine del più ereditario:
>>> class B(A, object): pass
>>> b = B()
A.__init__() called
.
funziona bene.L'ho presunto che in prima istanza, l'ereditarietà del object
prima di A
crea una specie di ambiguità del nome.Qualcuno mi interesserebbe a spiegare cosa sta succedendo qui?
Soluzione
A
è ereditato da object
o sottoclasse di object
, non funziona.La MRO garantisce che le basi più a sinistra vengono visitate prima di quelle a destra - ma garantisce anche che tra gli antenati se x è una sottoclasse di y, X è visitata prima di y.È impossibile soddisfare entrambe queste garanzie in questo caso
Python: problema con metaclasses in congiunzione più ereditarietà