Comparación de constructores en Java y en Python

En el curso de python me he liado a explicar cómo construcir excepciones propias de la aplicación. Para ello hay que hereadar de la clase Exception. La clase Exception tiene un constructor que admite n parámetros cualesquiera y se los guarda. Es una forma de guardar información adicional al levantar una excepción.

Pues me encontré una sorpresa. Cree mi propia excepción heredando de Exception de la forma más simple posible

class MyException(Exception):
pass

y resulta que sólo con eso puedo hacer cosas como

error = MyException(param1, param2, param3,…)

es decir, puedo añadir los parámetros que quiera usando el constructor de la clase padre.

Como vengo de Java, donde esto no es así, me llamó poderosamente la atención y me puse a investigar.

En Java sólo puedes llamar a constructores que hayas declarado explicitamente en la clase hija, o al constructor por defecto sin parámetros si no has declarado ninguno. Esto es así porque Java obliga a llamar a un constructor de la clase hija y este a su vez y de forma automática llama a un constructor de la clase padre. Al de defecto si no le hemos indicado explícitamente que haga otra cosa

En Python la resolución de constructores no es así. Si tu instancias una clase hija con un constructor (unos parámetros concretos), Python busca ese constructor en la clase hija. Si lo hay lo llama y no va a llamar de forma automática al de la clase padre. Si no lo hay en la clase hija, busca ese constructor en la clase padre (o en las clases padre en determinado orden, porque Python admite herencia múltiple) y si lo encuentra lo llama.

Así que en Python es perfectamente posible construir una clase hija sin que se llame a ningún constructor de la clase padre o que se se instancia una clase hija sin que se llame a ningún constructor de la clase hija.

En Java esto es más rígido. Si instancias una clase hija, obligatoriamente se tiene que llamar a un constructor de la clase hija y este llamará de forma automática a un constructor de la clase padre.

Sin embargo, para métodos normales y atributos el comportamiento de ambos lenguajes es más similar. Si en una instancia de una clase hija llamas a un método, ambos lenguajes buscan el método en la clase hija y lo llaman si existe. Si no existe, lo buscan en la clase padre y lo llaman si existe.

La diferencia entre ambos lenguajes es solo en los constructores. Java obliga a una llamada en cascada de constructores hijo, padre, abuelo… mientras que Python los trata como si fueran métodos normales.

Entradas relacionadas:

Esta entrada ha sido publicada en java, python y etiquetada como , , , . Guarda el enlace permanente.

Deja una respuesta

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.