Uso de super().__init__() para herencia en Python

En Python, la función super().__init__() permite inicializar correctamente los atributos de la clase padre dentro de una subclase, lo que es crucial para mantener la jerarquía de herencia. Esta técnica se apoya en el orden de resolución de métodos (MRO) para determinar qué clase base se invoca al usar super().

Cuando se define un método __init__() en una subclase sin llamar a super().__init__(), los atributos de la clase padre no se asignan a las instancias, lo que puede causar errores si se intenta acceder a ellos. Al incorporar super().__init__(), se garantiza que los atributos hereaddos se establezcan correctamente.

# Ejemplo sin super().__init__() - atributos faltantes
class Animal:
    def __init__(self, especie, habitat):
        self.especie = especie
        self.habitat = habitat

class Perro(Animal):
    def __init__(self, nombre, edad):
        self.nombre = nombre
        self.edad = edad
        # Falta la inicialización de Animal

mi_perro = Perro('Rex', 5)
print(mi_perro.__dict__)  # Salida: {'nombre': 'Rex', 'edad': 5}, sin especie ni habitat

# Ejemplo con super().__init__() - atributos completos
class Animal:
    def __init__(self, especie, habitat):
        self.especie = especie
        self.habitat = habitat

class Perro(Animal):
    def __init__(self, nombre, edad, especie, habitat):
        super().__init__(especie, habitat)
        self.nombre = nombre
        self.edad = edad

    def ladrar(self):
        return f'{self.nombre} está ladrando'

mi_perro = Perro('Max', 3, 'canino', 'doméstico')
print(mi_perro.__dict__)  # Salida: {'especie': 'canino', 'habitat': 'doméstico', 'nombre': 'Max', 'edad': 3}
print(mi_perro.ladrar())  # Max está ladrando

En herencia múltiple, super() sigue el MRO para evitar inicializaciones duplicadas o conflictos. Por ejemplo, al heredar de una clase como dict, se puede usar super().__init__() para adquirir funcionalidades nativas de diccionarios en la subclase.

# Herencia de dict con super().__init__()
class DiccionarioPersonalizado(dict):
    def __init__(self, valor_inicial):
        super().__init__()  # Inicializa como diccionario
        self['inicio'] = valor_inicial
        self.metadata = 'diccionario modificado'

mi_dict = DiccionarioPersonalizado('hola')
print(mi_dict['inicio'])  # Salida: hola
print(mi_dict.metadata)   # Salida: diccionario modificado
mi_dict['nueva_clave'] = 123
print(mi_dict)  # Muestra el diccionario con claves y valores

Etiquetas: Python super() __init__ herencia MRO

Publicado el 6-11 04:03