Introducción al objeto
Preámbulo
El objetivo de este libro es enseñarle lógica de programación para que pueda programar sus primeros scripts en Python. Todo aprendizaje sobre desarrollo informático parte de lo que hemos visto hasta ahora: la programación imperativa o procedimental si lo prefiere.
Este estilo de programación está en la raíz de todos los demás, ya sea la programación funcional o la programación orientada a objetos (POO u Object-Oriented Programming en inglés), las dos grandes tendencias actuales en el desarrollo informático.
En el momento de escribir este libro, vemos cómo vuelve a cobrar protagonismo un estilo de programación: la programación funcional. Se trata de un estilo que se ha utilizado casi desde el nacimiento de la máquina y que ahora está empezando a implementarse en la mayoría de los lenguajes. La programación funcional moderna aún está en pañales y se utiliza más a menudo para procesar masas de datos, como en Big Data, por ejemplo, razón por la que no la introducimos en este libro.
La programación orientada a objetos acapara hoy fácilmente más del 80% del mercado del desarrollo informático. Surgió a principios de los 90 y supuso una auténtica revolución en la forma de modelar los datos en los programas.
Para que pueda continuar su aprendizaje...
La naturalidad del objeto
1. Introducción
La programación orientada a objetos se deriva del pensamiento humano. Es una técnica de programación de alto nivel que permite a los desarrolladores modelar sus datos como lo harían en la vida real.
Con esto queremos decir que este tipo de programación se inspira en objetos de la vida real. Consideremos un objeto sencillo como una botella de agua. Cada botella de agua tiene sus propias características especiales pero, al fin y al cabo, sigue siendo una botella de agua. En programación orientada a objetos, podemos traducir este ejemplo con una clase BotellaAgua que describa las propiedades de cada botella de agua: su capacidad y si es mineral y/o carbonatada. De esta manera, con esta clase podemos crear varias botellas de agua, nuestros objetos, que todas tendrán un valor determinado para su capacidad y tipo de agua.
En pocas palabras, piense en las clases como la evolución de las ESTRUCTURAS y en los objetos como la evolución de los REGISTROS. Las estructuras, como sucede con las clases, permiten vincular diferentes variables en un nuevo tipo de datos. Las clases también vinculan los procesos y las variables con las que se relacionan. Una estructura se instancia con un registro y una clase con un objeto.
La programación orientada a objetos va mucho más allá de una simple evolución de las ESTRUCTURAS, porque nos permite tener un código mejor organizado, es decir, organizado de forma más intuitiva para el ser humano, al mismo tiempo que se factoriza la mayor cantidad de código posible.
2. El objeto y la clase
La clase nos permite modelar nuestros datos en un algoritmo o programa con una nueva organización.
Agrupamos los campos de una estructura como atributos de la clase y las funciones y procedimientos que operan sobre estos campos, como métodos de la clase.
Puede pensar en la clase como un nuevo tipo de datos complejo que usted crea para satisfacer sus necesidades.
A partir...
Trabajar con objetos
1. Introducción
Las primeras secciones de este capítulo han introducido los aspectos básicos de las clases y los objetos. Esta sección está dedicada a la manipulación de objetos, desde su creación hasta su destrucción en memoria.
Como el lector habrá adivinado, una clase es una estructura de datos más que compleja, por lo que un objeto será inevitablemente un puntero.
2. Instanciación y asignación de memoria
Para instanciar un objeto, utilizaremos el mismo operador que para los punteros: NUEVO. Sin embargo, lo que sigue a este operador será diferente: no será el nombre de la clase, sino el constructor de la clase.
a. Constructor
El constructor de una clase es un método obligatorio en la clase. Se utiliza para asignar la memoria del objeto que instancia la clase.
El constructor siempre tiene el mismo nombre que la clase y no devuelve nada. Puede recibir argumentos o no, dependiendo de nuestras necesidades.
Por convención, el constructor recibe como argumentos los valores que se asignarán a los atributos del objeto. En el caso de un constructor sin argumentos, que llamamos constructor por defecto, inicializa los atributos con valores por defecto, como su nombre indica.
El constructor se define mediante la palabra clave CONSTRUCTOR en primer lugar en el bloque de los métodos públicos.
Así que vamos a implementar un constructor en nuestra clase Producto para ilustrar este método específico.
CLASE Producto
ATRIBUTO PUBLICO
INICIO
cantidad : ENTERO
FIN
ATRIBUTO PRIVADO
INICIO
nombre : CADENA
FIN
METODO PUBLICO
INICIO
CONSTRUCTOR Producto(name : CADENA, cuanto : ENTERO)
INICIO
nombre <- name
cantidad <- cuanto
FIN
PROCEDIMIENTO disminuir_cantidad(E : cuanto : ENTERO)
INICIO
cantidad <- cantidad - cuanto
FIN
FIN
METODO PRIVADO
INICIO
PROCEDIMIENTO producto_comprado() ...
Ir más lejos
1. Polimorfismo
Polimorfismo es una gran palabra para describir el comportamiento perfectamente lógico de la herencia en la programación orientada a objetos. Amplía el vínculo entre una clase padre y sus clases hijas, tanto en términos de instanciación como de implementación de métodos.
a. Objeto
Gracias al polimorfismo, un objeto de tipo de la clase padre puede llamar al constructor de una de sus clases hijas. Como recordatorio, puede utilizar la siguiente técnica mnemotécnica: una madre puede estar embarazada de una hija y, por tanto, contenerla, pero una hija no puede estar embarazada de su madre.
Así que podemos hacer que nuestra clase EnlaceDoble sea adecuada:
Clase Enlace
ATRIBUTO PUBLICO
INICIO
valor : tipo
siguiente: Enlace
FIN
METODO PUBLICO
INICIO
CONSTRUCTOR Enlace(v : tipo)
INICIO
valor <- v
siguiente <- NULL
FIN
DESTRUCTOR ~Enlace()
INICIO
siguiente <- NULL
FIN
FIN
Clase EnlaceDoble HEREDA DE Enlace
ATRIBUTO PUBLICO
INICIO
anterior : EnlaceDoble
FIN
METODO PUBLICO
INICIO
CONSTRUCTOR EnlaceDoble(v : tipo)
INICIO
Enlace(v)
anterior <- NULL
FIN
DESTRUCTOR ~EnlaceDoble()
INICIO
~Enlace()
anterior <- NULL
FIN
PROCEDIMIENTO instanciar_siguiente()
INICIO
siguiente <- NUEVO EnlaceDoble(1)
FIN
FIN
En el método instanciar_siguiente, asignamos el objeto con el constructor...
Objetos en Python
1. Objeto y clase en Python
La programación orientada a objetos se implementa en el lenguaje Python. Las clases se definen utilizando la palabra clave class. Para un código limpio, le pedimos que cree un archivo para cada clase, y un archivo para la parte main de nuestro programa.
# archivo punto.py
class Punto :
pass
# archivo main.py
from punto import Punto
mi_punto…
Así que creamos una clase Punto en un archivo punto.py que importamos al archivo que contiene el main, el archivo main.py.
Para facilitar la importación de nuestras clases, todos los archivos de script deben estar en el mismo directorio.
Los atributos de una clase Python no se pueden declarar sin inicializarse, debido al tipado dinámico del lenguaje. Debido a la sintaxis del lenguaje, los atributos sólo se pueden declarar en los métodos de la clase. Veamos cómo declarar los métodos de una clase para poder declarar sus atributos.
2. Uso del self para los métodos
En Python, para diferenciar una función de un método, necesitamos colocar la palabra clave self en el primer argumento del método, que siempre está definido por la palabra clave def. Esta palabra clave indica que el método está unido a la clase, donde self se traduce por ’sí mismo’.
Para llamar a un método, utilizamos el operador "." del objeto instanciado.
Cuando se llama a un método, la palabra clave self desaparece de la lista de argumentos, por lo que sólo es obligatoria cuando se define un método.
El constructor es un método especial que se debe llamar __init__(self, arg1, arg2...) donde los argumentos o el self, son opcionales.
Para llamar al constructor e instanciar un objeto, basta con llamar al nombre de la clase seguido de la lista de argumentos del constructor (se debe utilizar un par de corchetes vacíos si el constructor sólo se define con self).
Declaramos e inicializamos los atributos de la clase en su constructor. Para distinguir una variable de un atributo, un atributo siempre tiene la forma self.identificador. Además de esta restricción, un atributo se puede manipular de la misma manera que una variable o un objeto.
# archivo punto.py
class Punto :
def __init__(self...
Ejercicios
1. Ejercicio 1
Modele en UML y luego con un algoritmo una clase Duracion con tres atributos privados:
-
el número de horas de la duración;
-
el número de minutos de la duración;
-
el número de segundos de la duración.
Y los siguientes métodos públicos:
-
Un constructor por defecto (todos los atributos tendrán valor cero) y un constructor que inicializa todos los valores. Comprobaremos que los números de horas, minutos y segundos son positivos; si no, consideraremos sus opuestos. También haremos las conversiones necesarias para que los números de minutos y segundos sean estrictamente menores que 60.
-
Un método para mostrar la duración (en el formato 3h10m00s).
-
Un método que convierte la duración en un número de segundos.
-
Un método que añade un número de segundos a la duración.
A continuación, codifique los scripts Python correspondientes.
2. Ejercicio 2
Implemente en un algoritmo la relación de herencia entre las clases Animal, Mamifero y Ave del diagrama de clases de la figura siguiente.
Diagrama de clase de los animales
El procedimiento muestra() visualiza por consola todos los atributos de la clase.
Codifique los scripts Python correspondientes.
3. Ejercicio 3
En Python, codifique las siguientes clases:
-
Una clase Circulo. Los objetos construidos a partir de esta clase serán círculos de varios tamaños....