title

Contributors:

Programación orientada a objetos en Python

title

Ideas principales en la orientación a objetos

La orientación a objetos se describe por 3 características:

La noción fundamental de orientación a objetos es que los datos, métodos y funciones están mejor organizados en clases.

OBJETOS

Un objeto se define como aquello que tiene atributos y métodos. Los atributos son las características de los objetos, mientras que los métodos son operaciones o actividades, definidas como funciones, que puede realizar el objeto.

Se observa que el resultado de help(a) indica que a es un objeto. Además de esto, escribiendo dir(a) se despliegan los atributos y métodos de a, demostrando que cumple las condiciones para ser un objeto.

ACTIVIDAD

En un nuevo jupyter notebook:

Es mejor usar las funciones integradas de Python sobre los métodos, ya que estos últimos realizan controles de seguridad adicionales que demoran más la operación y obtienen el mismo resultado.

Las funciones de módulos como math también son objetos. Utilicemos la función sin() para verificar esto

CLASES

Las clases son colecciones lógicas de atributos que describen un tipo de objeto y definen cómo crear un objeto en particular.

EJEMPLO

Un físico decide usar clases para abstraer detalles de implementación de objetos en una simulación de física de partículas

Un físico debe decidir qué clases crear. Estas clases deben asegurar que los datos y las funciones relacionadas a diferentes objetos, estén separadas (encapsuladas) de las demás.

Ya que es un caso de física de partículas, lo más lógico es crear una clase Particle.

¡Creamos nuestra primera clase!

Ahora, para hacerla una clase bien formada se pueden incluir atributos como:

VARIABLES DE CLASE

Son datos aplicables a todos los objetos de la clase. Ya que todas las partículas solo tienen en común que son partículas...

Por tanto, las variables de clase son excelentes para datos y métodos que son universales en la clase. Para los atributos únicos para cada objeto, existen las variables de instancia.

VARIABLES DE INSTANCIA

Debido a que existen características únicas para cada partícula, que no se comparten con las demás partículas de la clase, se deben crear las variables de instancia que son aquellas variables propias de cada instancia de la clase.

Existen varias caracterísiticas como posición, masa, carga y espín. Por ahora crearemos 2 partículas con sus respectivas posiciones.

ACTIVIDAD

En la siguiente celda, añada una nueva partícula a la lista, asígnele una posición e imprimala.

HASTA EL MOMENTO

Una clase se puede interpretar como el plano que describe cómo es un objeto de la clase, por tanto podemos entender que a partir de la clase podemos fabricar objetos. A ese objeto construido se le denomina instancia, y al proceso de construir un objeto se le llama instanciación.

CONSTRUCTORES

Cuando se instancia un objeto, un constructor es ejecutado de manera inmediata y automática, para dar un valor inicial a los atributos del nuevo objeto. Es un método que se crea por defecto bajo el nombre de init (), aunque también puede ser creado por el usuario.

Aunque esta función se ejecuta automáticamente cuando el objeto es creado, es una buena práctica de programación hacer que esta función sea la responsable de la inicialización de todas las variables de instancia de un objeto.

Ya que init () es una función de una clase, se denomina método. Es necesario que todo método tenga al menos una entrada y que el primer argumento sea la instancia a la que va a estar atado. En este caso, el método tiene una entrada self que se refiere a la instancia. La palabra self es una convención, se puede cambiar por cualquier otra dentro de la definición del método.

Para poder añadir los valores reales de los atributos de un objeto, hay que crear el objeto y luego agregar 1 por 1 los valores de cada atributo. Esto para cada objeto... Por tanto es necesario modificar el método init () para hacerlo más eficiente al momento de agregar datos de algún objeto.

Ahora, se pueden asignar los valores correspondientes a cada atributo cuando se llame el método!! YEIIIII!!!

Métodos

Los métodos se distinguen de las funciones por el hecho de que están ligadas a una definición de clase. El método init () es súper importante ya que es constructor. Ahora, añadamos otro método que nos permita ver los valores de los atributos de un objeto sin tener que imprimirlos explícitamente.

Ahora, se pueden imprimir todos los atributos de la partícula con una sola línea!

Los métodos también puede modificar variables de instancia. En física de partículas, los quarks tienen una característica llamada sabor, el cual puede tomar los valores: up, down, top, bottom, strange y charm. La interacción débil puede cambiar el sabor de un quark de up a down, de top a bottom o de strange a charm.

ACTIVIDAD

En la siguiente celda cree una clase llamada Quark, el método init () para añadir el sabor y un método flip() que cambie el sabor (variable de instancia) de los quarks.

Los métodos son poderosos porque tienen acceso a los atributos de un objeto. Por esto, los físicos los han utilizado ampliamente.

EJEMPLO

Un físico modificó la clase Particle para agregar un método que calcule el menor valor posible de incertidumbre en la posición de una partícula por medio del Principio de incertidumbre de Heisenberg

Métodos estáticos

Se pueden crear métodos que estén asociados con la clase pero que no cambien de valor para cada objeto, estos son los métodos estáticos.

Siguiendo el ejemplo, se puede crear un método estático de los posibles sabores de los quarks:

Anteriormente se dijo que todo método debía tener por lo menos 1 entrada y que la primera entrada debía ser el objeto. En este caso, como los métodos estáticos no están ligados a los objetos, no es necesario poner esta entrada.

Duck Typing

"When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck"

Esto se refiere a que Python no revisa el tipo de objeto explícitamente, sino que revisa el comportamiento del objeto cuando se evoca un método. Por esto, en la instanciación, no se definió el tipo de objeto que se creaba, sino que se puso un nombre, una clase y con ella, unos atributos y métodos.

En nuestro ejemplo de física de partículas, todas las partículas tienen un método carga() válido y por tanto se pueden tratar por igual. Se puede crear una función que calcule la carga total de un grupo de partículas, sin saber nada de cada una de ellas.

De ser necesario, se puede evitar el duck typing mediante una verificación del tipo de objeto, esto se hace explícitamente con la función integrada isinstance(), que verifica la clase a la que pertenece el objeto.

Polimorfismo

El poliformismo ocurre cuando una clase hereda los atributos de la clase base (o parent class). Es la habilidad de redefinir métodos para subclases. Vamos a crear una clase llamada Elemental(), cuyos objetos serán todas las partículas elementales

Se observa que la clase Elemental() acepta a otra clase como entrada, (la clase Particle()), en vez de object. Esta es la manera de denotar que Elemental() es una subclase de Particle(), de tal manera que Elemental() hereda los atributos y comportamientos de la clase Particle().

ACTIVIDAD

En la siguiente celda, crear Compuestas() como una subclase de Particle(), ya que las partículas compuestas, se constituyen de partículas elementales, pero no comparten sus atributos y en cambio, si tienen carga, masa y posición, es decir, los atributos de la clase base. En esta subclase, dentro del constructoe se va a crear el atributo constituyentes, donde irá una lista de partículas elementales para cada partícula compuesta.

Subclases

Las subclases Elemental() y Compuestas son objetos para la clase base (Particle()), por tanto, estas subclases reciclan las funciones y los atributos asignados a la clase base, para no tener que reescribirlos. Además, en una subclase se pueden modificar los atributos ya definidos en la clase base:

Superclases

La superclase es la clase base de una subclase, así que cualquier clase puede ser una superclase. Por ejemplo, Elemental() es una subclase perteneciente a Particle(), pero como los quarks son un tipo de partícula elemental, Quark() puede ser una subclase de Elemental() para heredar sus atributos, haciendo que esta última se convierta en una superclase.

Herencia múltiple

Es cuando una subclase hereda de más de una superclase. Por ejemplo en mecánica cuántica existe la dualidad onda-partícula y por tanto, las partículas elementales deberán heredar atributos de onda como una frecuencia y amplitud, y atributos de partícula como la carga.

ACTIVIDAD FINAL

En un nuevo jupyter notebook:

Contributors: