Domanda

Quando si deriva da un tipo incorporato e da qualche altra classe, sembra che il costruttore del tipo incorporato non chiami il costruttore Super Class. Ciò si traduce in metodi __init__ che non vengono richiesti tipi che vengono dopo l'incorporamento nel MRO.

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 campione, un .__ init__ non viene mai chiamato. Quando B è definito come class B(A, list) Invece - cambiando l'ordine ereditario - funziona come previsto (cioè a .__ init__ viene chiamato).

Questa sottile dipendenza dall'ordine ereditarie sembra piuttosto non pitone, è destinata in questo modo? Significa anche che non devi mai derivare da tipi incorporati in gerarchie di classe complesse, perché non si può sapere dove il builtin finisce nel MRO quando qualcun altro deriva dalle tue lezioni (horror di manutenzione). Mi sto perdendo qualcosa?

Informazioni extra: Python versione 3.1

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top