Skip to main content
Curso Python 3.5

Curso Python – tema 11 – POO Programación Orientada a Objetos

La programación Orientada a Objetos abre un nuevo mundo de posibilidades en Python

Hasta el momento hemos implementado inicialmente programas utilizando una estructura lineal, posteriormente vimos las funciones y trabajamos con programación estructurada. A partir de este momento, vamos a utilizar la programación orientada a objetos. Prácticamente todos los lenguajes implementan la posibilidad de la POO (Programación Orientada a Objetos).

 

Definición de conceptos de POO

Antes de proseguir explicando la Programación Orientada a Objetos debemos tener más o menos claro la diferencia entre una clase y un objeto, como es normal, estos conceptos los afianzaremos por medio de la práctica pero también es necesaria una base teórica para comprenderlo realmente.

Una clase es una plantilla para la creación de objetos de datos según un modelo definido previamente. Las clases se utilizan para la definición de atributos (variables) y métodos (funciones).

Un objeto sería una instancia de esa clase, es decir, un objeto sería la llamada a una clase. Para que os sea más sencillo, en el tema anterior importábamos el módulo random de python. Este módulo en sí es una clase, al llamar a dicha clase estamos creando una instancia (objeto) de dicha clase. Cuando llamamos al método randint() realmente estamos llamando al método randint de la clase random a través de un objeto creado para dicho fin.

Viendo esta relación, podemos llegar fácilmente a la conclusión de que para crear un objeto, debemos crear previamente la clase, la cual queremos instanciar.

Con la teoría aprendida, vamos a verlo más fácil con un ejemplo.

Implementaremos una clase llamada Persona que tendrá como atributo (variable) el nombre de la persona y dos métodos (funciones). El primero de los métodos inicializará el atributo nombre y el segundo mostrará por pantalla el contenido del mismo. Definir dos instancias (objetos) de la clase Persona.

 

Como ya dijimos en una vez, conviene llamar a las variables, clases, etc. Con un nombre que represente aquello que queremos guardar además, de comentarios para asegurarnos que cualquiera pudiera interpretar nuestro programa sin conocerlo.

Para crear nuestra clase utilizamos la palabra clave ‘class’ seguido del nombre de dicha clase. Los métodos se definen utilizando la misma sintaxis que cualquier otra función pero, vemos algo diferente. Todos los métodos tienen como primer parámetro el identificador self que hace referencia al objeto que llamó a dicho método. Dentro de la función diferenciaremos los atributos del objeto utilizando el identificador self seguido de un punto y el nombre del atributo. Separando de esta manera las variables de nuestro objeto con otras variables que utilicemos como apoyo en nuestras funciones.

Para la creación de un objeto, definiríamos el objeto llamado persona1 asignándole el nombre de la clase seguido de los paréntesis de apertura y cierre.

 

Después llamamos al método inicializar al cual le asignaremos el nombre de la persona. Como hemos dicho, el parámetro self hace referencia al objeto al cual llama al método. De esta forma en la función mostrar no le pasamos ningún atributo porque ya estaba definido en el objeto persona1. Además de poder llamar a un atributo, el parámetro self hace referencia al objeto y podemos llamar a una función dentro de la clase utilizando la sintaxis

 

Método especial __init__ de la clase

El método __init__ es una función especial con el objetivo de inicializar los atributos del objeto que creamos.

Implementar este método tiene varias ventajas como son

  • Es el primer método en ejecutarse al crear un objeto.
  • Podemos asegurarnos de que siempre se va a llamar al crear un objeto.

 

Veamos en un ejemplo como sería

 

Vemos en el ejemplo que podemos especificar la función y establecer los atributos una vez dentro de ella o, podemos pasar por parámetro los atributos y después igualarlas a los atributos de nuestro objeto.

Hasta ahora hemos visto como definir atributos para una clase anteponiendo la palabra clave self. Los atributos son independientes por cada objeto de la clase, es decir, si definimos tres objetos de la clase alumno, cada uno tendrá un atributo nombre pero cada uno tendrá su valor independiente del resto.

 

En algunos casos, necesitaremos almacenar algún dato que se comparta entre todos los objetos definidos de una clase, en estas situaciones utilizaremos las variables de clase.

Para definir una variable de clase lo haríamos dentro de la clase pero fuera de sus métodos

 

De esta forma podemos inicializar cualquier tipo de dato y sería igual para todos las instancias de la clase que hayan sido creadas.

 

Método especial __str__

Al igual que podíamos convertir una variable de tipo entero, float, etc… en una de tipo string con la función str(), podemos utilizar un método en una clase para retornar un string.

 

En este ejemplo, devolvemos un string con el método __str__ que mostrará el dato que le indiquemos al imprimir dicho objeto. Para generar dicho string, debemos concatenar valores fijos como el paréntesis o la coma enteros dobles comillas y convertir a string los atributos que no lo son como vemos en el ejemplo anterior.

 

Herencia en Python

En Python dos clases además de poder tener una relación de colaboración, también pueden tener una relación de herencia.

La herencia significa que se pueden crear nuevas clases partiendo de otras clases ya existentes, que heredarán todos los atributos y métodos de su clase padre además, de poder añadir los suyos propios.

Por ejemplo, si tenemos una clase llamada vehículo, esta sería la clase padre de las clases coche, moto, bicicleta… Cada una de estas subclases tendría los atributos y métodos de su padre vehículo y aparte tendrían sus propios métodos cada uno de ellos.

 

Vamos a verlo con un ejemplo práctico

Realizar un programa que conste de un clase Persona con dos atributos nombre y edad. Los atributos se introducirán por teclado y habrá otro método para imprimir los datos.

Declarar una segunda clase llama Empleado que hereda de la clase Persona y agrega el atributo sueldo. Debe mostrar si tiene que pagar impuestos o no (sueldo superior a 3000).

Crear un objeto de cada clase.

 

La clase Persona como vemos, no tiene nada nuevo y creamos un objeto de la misma forma que lo realizado hasta ahora. Por el contrario en la clase Empleado sí que vemos cosas nuevas.

 

Añadiendo entre paréntesis la clase Persona, estamos especificándole que hereda dicha clase. Entonces podemos decir que la clase Empleado heredará los atributos de Persona.

 

Otra cosa nueva es la función super(), con la cual hacemos referencia a la clase heredada.

Otra forma podría ser

De esta otra forma llamamos directamente a la clase en lugar de al método super().

 

Problemas propuestos

Ejercicio 1

Realizar un programa que conste de una clase llamada Alumno que tenga como atributos el nombre y la nota del alumno. Definir los métodos para inicializar sus atributos, imprimirlos y mostrar un mensaje con el resultado de la nota y si ha aprobado o no.´

Ver

 

Ejercicio 2

Realizar un programa que tenga una clase Persona con las siguientes características. La clase tendrá como atributos el nombre y la edad de una persona. Implementar los métodos necesarios para inicializar los atributos, mostrar los datos e indicar si la persona es mayor de edad o no.

Ver

 

Ejercicio 3

Desarrollar un programa que cargue los datos de un triángulo. Implementar una clase con los métodos para inicializar los atributos, imprimir el valor del lado con un tamaño mayor y  el tipo de triángulo que es (equilátero, isósceles o escaleno).

Ver

 

Ejercicio 4

Realizar un programa en el cual se declaren dos valores enteros por teclado utilizando el método __init__. Calcular después la suma, resta, multiplicación y división. Utilizar un método para cada una e imprimir los resultados obtenidos. Llamar a la clase Calculadora.

Ver

 

Ejercicio 5

Realizar una clase que administre una agenda. Se debe almacenar para cada contacto el nombre, el teléfono y el email. Además deberá mostrar un menú con las siguientes opciones

  • Añadir contacto
  • Lista de contactos
  • Buscar contacto
  • Editar contacto
  • Cerrar agenda
Ver

 

Ejercicio 6

En un banco tienen clientes que pueden hacer depósitos y extracciones de dinero. El banco requiere también al final del día calcular la cantidad de dinero que se ha depositado.

Se deberán crear dos clases, la clase cliente y la clase banco. La clase cliente tendrá los atributos nombre y cantidad y los métodos __init__, depositar, extraer, mostrar_total.

La clase banco tendrá como atributos 3 objetos de la clase cliente y los métodos __init__, operar y deposito_total.

Ver

 

Ejercicio 7

Desarrollar un programa que conste de una clase padre Cuenta y dos subclases PlazoFijo y CajaAhorro. Definir los atributos titular y cantidad y un método para imprimir los datos en la clase Cuenta. La clase CajaAhorro tendrá un método para heredar los datos y uno para mostrar la información.

La clase PlazoFijo tendrá dos atributos propios, plazo e interés. Tendrá un método para obtener el importe del interés (cantidad*interés/100) y otro método para mostrar la información, datos del titular plazo, interés y total de interés.

Crear al menos un objeto de cada subclase.

Ver

 

Además tenéis la lista completa de ejercicios en nuestro repositorio en github.

Con esto acabamos el undécimo capítulo de nuestro curso de python 3.5. Si tienen cualquier duda relacionada con el contenido explicada en este capítulo, pueden exponerla en sus comentarios y le ayudaremos a resolverla lo antes posible. Nos vemos en el siguiente capítulo donde veremos una nueva forma de redefinir operadores con objetos.

<- Anterior Volver al índice Siguiente ->

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *