Curso de programación

Clase 9: Programación orientada a Objetos Parte I

Clase 9: POO

Contenido de la clase

Introducción a la Programación Orientada a objetos

Parte I

Programación orientada a objetos

La Programación orientada a Objetos (POO) es un paradigma de programación, es decir, un modelo o un estilo de programación que nos da unas guías sobre cómo trabajar con él. Se basa en el concepto de clases y objetos.

Con el paradigma de Programación Orientado a Objetos lo que buscamos es dejar de centrarnos en la lógica pura de los programas, para empezar a pensar en objetos, lo que constituye la base de este paradigma. Esto nos ayuda a poder modelar objetos de la vida real o abstractos con su comportamiento y características de forma directa hacia un lenguaje de programación.

Un programa orientado a objetos puede verse como: «Un conjunto de objetos que colaboran enviándose mensajes».

Conceptos de POO

La POO introduce nuevos conceptos, que amplían los conceptos vistos hasta el momento.

  • ClaseEs una especie de plantilla o molde para crear objetos a partir de ella. Esta plantilla es la que contiene la información, características y capacidades que tendrán los objetos que deriven de la clase. En la clase de definen los atributos y el comportamiento (o mensajes) que tendrán los objetos.
  • ObjetoEs un ente que consta de un estado (atributos) y de un comportamiento, que a su vez constan respectivamente de datos almacenados y de tareas realizables durante el tiempo de ejecución. Un objeto es creado a partir de una clase y son capaces de interactuar con otros objetos y partes del programa.

Conceptos de POO (p2)

  • Atributo o estado (Dato)Es un dato que se define en la clase y que serán los datos que definirá el estado del objeto. El valor de los datos pueden cambiar durante la ejecución del programa.
    En la práctica, un atributo será literalmente una variable que almacenarán datos del objeto.
  • Métodos (Código)Define ya descrito comportamiento del objeto y por lo tanto es lo que un objeto puede o es capaz de hacer.
    En la práctica, un método es una función que ejecuta un código escrito en la clase.

Además de los conceptos previamente vistos, la POO incluye más conceptos como Herencia, Abstracción, Polimorfismo, Encapsulamiento, Acoplamiento y Cohesión que veremos mas adelante a medida que avancemos en la POO.

Conceptos de POO(p3)

Para tratar de entender con ejemplos, podemos crear una clase para representar animales llamada "Animal" y tener una serie de atributos, como "nombre" y "edad", y una serie de tareas realizables (comportamiento) que estos animales pueden tener, como caminar o comer, y que a su vez se implementan como métodos en la clase (funciones).

Otro ejemplo, podemos tener una clase para representar vehículos, llamada "Vehiculo". Los atributos pueden ser patente, marca, modelo, etc. Y el comportamiento puede ser arrancar, poner alarma, acelerar, etc.

Como puede verse, cosas cotidianas como vehículos, animales o cualquier cosa que nos imaginemos pueden ser representadas en un lenguaje de programación mediante el paradigma POO.

Motivación

Luego de esta breve explicación, parece ser que la POO es bastante lógica, pero no es algo que existió siempre en los lenguajes de programación y muchos de estos no lo soportan.

En parte surgió debido a las necesidades de los programadores, en el trascurso de los años, de hacer programas cada vez mas complejos.

En el mundo de la programación hay gran cantidad de aplicaciones que realizan tareas muy similares y es importante identificar los patrones que nos permiten no reinventar la rueda. La programación orientada a objetos intentaba resolver esto.

Uno de los primeros mecanismos que se han utilizado para agrupar bloques y resolver problemas repetitivos fueron las funciones. Si bien las funciones son muy útiles, no son suficientes para resolver problemas complejos por si solas.

Motivación (p2)

Imaginemos que tenemos un juego de naves en 2D moviéndose por la pantalla. Cada una de ellas tendrá una una posición (x,y), un color, un tamaño de nave como también un comportamiento cada una.

Sin usar POO tendríamos que definir una variable por cada dato que queremos almacenar para cada nave. Si tenemos 10 naves y 5 datos para almacenar por cada nave, ¡Tendríamos que definir 50 variables!. El código sería un verdadero desorden y más aún si quisieramos modificar la cantidad de naves o agregar atributos nuevos.

Si diseñamos el programa con una arquitectura orientada a objetos esto sería mucho mas sencillo.

Mediante una clase podríamos definir lo general de las naves; sus atributos y comportamiento, luego "fabricar" naves (crear objetos) cada una con sus cualidades.

Repaso:

Características básicas de la POO

  • Clase
  • Objeto
  • Atributos o datos
  • Comportamiento o métodos

¿Preguntas?

Definir clases, atributos y métodos

Definiendo clases

Como hemos mencionado anteriormente, una clase es como una plantilla para crear objetos. Imaginemos que queremos crear un objeto para representar un auto.


						# Creamos una clase vacía
						class Auto:
							pass # No hace nada
					

Ahora que tenemos la clase, podemos crear un objeto de la misma. Podemos hacerlo como si de una variable normal se tratase; nombre_variable=Clase(). Dentro de los paréntesis irían los parámetros de entrada si los hubiera.


						mi_auto = Auto()
						otro_auto = Auto()
					

Cuando se crea un objeto a partir de una clase se dice que se instancia una clase o que un objeto es instancia de una determinada clase.

En este ejemplo vimos una clase vacía, sin atributos ni comportamiento definido, lo cual no tiene ninguna utilidad práctica. Pero nos sirve para introducirnos en la sintáxis.

IMPORTANTE: Por convención, los nombres de las clases empiezan siempre en mayúsculas.

Definiendo atributos

Las clases pueden tener atributos y es importante saber que hay dos tipos:

  • Atributos de instancia:También llamados atributo de objeto. Son atributos (datos) que pertenecen solo a la instancia u objeto en particular. Es decir cada objeto tendrá sus propios datos basados en sus atributos de instancia. Para acceder al atributo de instancia, será requisito instanciar una clase. Es decir, crear un objeto.
  • Atributos de clase:Son atributos que pertenecen a la clase y que todos los objetos tendrán ese atributo. Como es un atributo de la clase, no es necesario instanciar una clase para acceder al atributo. Sino que basta con invocar a la clase seguido por el atributo.

De ahora en mas diremos variables de instancia a los atributos de instancia y variables de clase a los atributos de clase.

Definiendo métodos: constructor

Los lenguajes nos proveen un constructor por defecto para que cada clase pueda construir objetos. Pero a veces resulta muy útil tener nuestros propios constructores.

En Python hay un método especial llamado __init__ que se usa como constructor.


						class Auto:
							def __init__(self, un_modelo, un_color): # Constructor
								self.modelo = un_modelo # Variable de instancia
								self.color = un_color # Variable de instancia

						mi_auto = Auto('Fiesta', 'Blanco') # Se instancia objeto
						print(mi_auto.modelo, mi_auto.color) # Fiesta Blanco
						otro_auto = Auto('Cruze', 'Negro') # Se instancia objeto
						print(otro_auto.modelo, otro_auto.color) # Cruze Negro
					

Seguramente te hayas fijado en el self que se pasa como parámetro de entrada del método. Es una variable que representa la instancia de la clase, y deberá estar siempre ahí.

El uso de __init__ y el doble __ no es una coincidencia. Cuando veas un método con esa forma, significa que está reservado para un uso especial del lenguaje.

Definiendo métodos


						class Auto:
							origen = "Argentina" # Variable de clase

							def __init__(self, un_modelo): # Constructor
								self.modelo= un_modelo	# Variable de instancia
						
							def arrancar(self): # Método
								print("Auto encendido")
							def acelerar(self, velocidad): # Método
								print(f"Acelerando a {velocidad}km/h")
							
						mi_auto = Auto('Cruze')
						mi_auto.arrancar() # Auto encendido"
						mi_auto.acelerar(40) # Acelerando a 40km/h
					

Podemos acceder a los métodos con un punto luego del identificador del objeto. El primer parámetro de los métodos debe ser self. Ver código

En Python las variables de clase se definen fuera de los métodos y las variables de instancia van dentro de algún método.

Ejemplo

Queremos implementar en código el comportamiento de un semáforo.

El semáforo debe tener un estado de luz (Rojo o Verde) y de alguna forma deberíamos intercambiar entre un color de luz y el otro.

¿Cómo se les ocurre que podemos hacer?

  • Crear una clase Semaforo
  • Crear el constructor de la clase
  • Crear una variable de instancia para la luz
  • Crear un método para cambiar la luz

Vamos al ejemplo resuelto

Conclusiones sobre el ejemplo 1

  • Es necesario un método para definir variables de instancia. (L8)
  • Es posible definir valores por defecto a las variables de instancia (L8)
  • Es posible modificar las variables de instancia desde un método (L11)
  • Un constructor puede no tener parámetros de entrada (L17)
  • Es posible crear varios objetos de una clase (L23)
  • Es posible modificar las variables de instancia desde el programa principal (L24). Pero no es una buena práctica. Más adelante veremos que lo ideal es crear métodos para modificar los atributos (principio de encapsulación).

Los atributos son objetos

Si bien hasta ahora no lo hemos notado, los atributos son objetos. Con esta afirmación podemos crear una clase y que una instancia de esa clase sea el atributo de otra clase que estemos trabajando.


						class Estereo:
							def encender(self):
								# Código
							def apagar(self):
								# Código
							# ...  Más código ...

						class Auto
							def __init__(self, un_color): # Constructor
								self.audio = Estereo() # Objeto como va de instancia
								self.color = un_color
								# ...  Más código ...
					

De esta manera, podemos crear tantos objetos como creamos que sean necesarios. Y de hecho es bueno que hagamos una clase para cada objeto que contenga un comportamiento particular.

¿Preguntas?

Ejercicio en clase 1

Crea una clase llamada Persona que tenga los siguientes atributos: nombre y edad. Luego, crea un método llamado "saludar" que imprima un mensaje de saludo que incluya el nombre y la edad de la persona.

Glosario (p1/2)

  • POO: (Programación orientada a objetos): Un estilo de programación en el cual los datos y las operaciones que los manipulan se organizan en clases y métodos.
  • Clase: Una "plantilla" que definen los datos y comportamiento que tendrán los objetos creados a partir de la clase .
  • Objeto: Es una instancia de la clase a la cual pertenece. Tendrán los datos y comportamiento definidos en la clase.

Glosario (p2/2)

  • Método: Una función que se define dentro de una definición de clase y se invoca en instancias de esa clase.
  • Variable de instancia: Son variables que pertenecen a los objetos. Cada objeto creado tendrán sus propias variables de instancia.
  • Variable de clase: Son variables que pertenecen a la clase. No hace falta instanciar la clase para interactuar con dicha variable.

¡Fin de la clase!

Ir al inicio
Práctica 9
Exportar clase a PDF

Bibliografía