Categorías
Tutoriales

super().__init__(arg1, arg2)

No reescribas atributos

Si quieres agregar un nuevo atributo a alguna de las otras clases existentes, quienes ademas ya heredan atributos o metodos de la clase principal, deberias de considerar utilzar el metodo super() antes de reescribir todo.

Supongamos que queremos agregar un nuevo atributo a la clase «Cat», quien ya esta heredando los atributos y metodos de la clase «Pet»

La forma habitual de hacerlo seria cambiar el metodo de inicializacion inicial, pasando los atributos originales e incluyendo el nuevo atributo, en este caso «color», repetiendo todos los atributos de «Pet» en «Cat», como muestra la figura:

A pesar de que lo anterior es una solucion correcta, no deberia ser implementado. Por que?

A veces en el metodo de inicializacion del padre, otras cosas tambien estan pasando ademas de solo redefiniendo atributos. En esta instancia no seria correcto simplemente omitir el hecho de que no llamaremos el metodo __init__ desde el padre, y estariamos omitiendo una funcion muy importante que esta pasando aqui mismo.

Por ejemplo, en una aplicacion web probablemente esta inicializacion del padre este llamando a una base de datos preguntando por alguna informacion, asignando el objeto usando este metodo __init__ pero si luego lo que hacemos es redefinirlo en una nueva clase (hija) sera necesario entonces que tambien se tenga que llamar a esta nueva redefinicion de atributos para definir el objeto apropiadamente.

Para asegurarnos de que esto ocurre, cuando hacemos herencia de este tipo, si necesitamos definir los argumentos necesarios desde la clase padre pero debemos llamarlos de la siquiente forma.

Llamamos explicitamente los atributos

Y asignamos el objeto con super()

Lo que super() esto esta diciendo es dirigete o referencia a la clase superior (Pet).

Luego __init__() define el metodo que queremos llamar. Y finalmente le pasamos los argumentos name y age.

Presta atencion en que no es necesario pasar self como argumento finalmente quedando en lo siguiente:

Deja una respuesta

Tu dirección de correo electrónico no será publicada.