En Python, se admite la herencia múltiple, y las llamadas a los métodos de los padres se gestionan mediante un orden de resolución de métodos lineal (MRO - Method Resolution Order). La función super() permite llamar al método de la superclase en la jerarquía y es especialmente útil en la herencia compleja.
super() garantiza la correcta invocación de métodos de acuerdo con el MRO y no solo con el padre inmediato.
class A: def do(self): print('A') class B(A): def do(self): print('B') super().do() class C(A): def do(self): print('C') super().do() class D(B, C): def do(self): print('D') super().do() D().do() # Imprimirá: # D # B # C # A
Detalles: Cada método debe invocar super(), de lo contrario, el MRO se "romperá". Además, los constructores (__init__) deben llamar a super().__init__().
Pregunta: ¿Qué ocurrirá si en la jerarquía de herencia múltiple una de las clases "olvida" llamar a super() en su método?
Respuesta: El MRO se verá comprometido, y parte de los métodos de los padres simplemente no se invocarán. Ejemplo:
class A: def show(self): print('A') class B(A): def show(self): print('B') class C(A): def show(self): print('C') super().show() class D(B, C): def show(self): print('D'); super().show() D().show() # Imprimirá: D B # Los métodos C y A no se invocan en absoluto
Historia
super().__init__() en una de las clases intermedias. Como resultado, uno de los widgets no se inicializó correctamente, lo que solo señaló un error raro.Historia
Historia
En una compleja jerarquía de mixins, durante sobreescrituras, un método "olvidó" llamar a super(). Esto llevó a que una API endpoint no realizara la validación, mientras que la otra funcionaba correctamente. El error se encontró semanas después, estudiando manualmente el MRO.