Quando si deriva da un tipo incorporato e da un'altra classe, sembra che il costruttore del tipo incorporato non chiami il costruttore super-classe. Ciò comporta che i metodi __init__ non vengano chiamati per i tipi che vengono dopo il builtin nell'MRO.I tipi built-in Python 3 __init__ non chiama super() .__ init__?
Esempio:
class A:
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
print("A().__init__()")
class B(list, A):
def __init__(self, *args, **kwargs):
print("B().__init__() start")
super().__init__(*args, **kwargs)
print("B().__init__() end")
if __name__ == '__main__':
b = B()
In questo esempio, A .__ init__ non viene mai chiamato. Quando B è definito come class B(A, list)
invece - cambiando l'ordine di ereditarietà - funziona come previsto (cioè viene chiamato A .__ init__).
Questa dipendenza molto sottile dall'ordine di ereditarietà sembra piuttosto non-pitonica, è intesa in questo modo? Significa anche che non devi mai derivare da tipi built-in in gerarchie di classi complesse, perché non puoi sapere dove finisce il built-in nel MRO quando qualcun altro deriva dalle tue classi (horror di manutenzione). Mi sto perdendo qualcosa?
Info extra: Python versione 3.1
Python non ha mai avuto richiamo automatico del superclasse '__init__' metodi – Marcin
Cosa sarebbe chiamare' A .__ init__' con? 'list .__ init__' prende un argomento e genera un errore se ne ottiene ancora. Anche se accettasse altri argomenti arbitrari, sarebbe possibile annullare il primo, quindi ciò che avrebbe visto A sarebbe dipeso dall'ordine di ereditarietà. –
Una domanda simile: http: // StackOverflow.it/questions/3277367/how-does-pythons-super-work-with-multiple-inheritance Con la presa di Guido proveniente dalla risposta a questa domanda: http://python-history.blogspot.com/2010/06/method- resolution-order.html – aganders3