Conceptos básicos de programación orientada a objetos
Los objetos son una abstracción del mundo real que poseen: - Estado: atributos o propiedades del objeto - Comportamiento: métodos o acciones que puede realizar
Por ejemplo, un perro tiene una edad y un peso, que pueden cambiar con el tiempo. El perro tiene comportamientos como ladrar, caminar, morder, etc.
La programación orientada a objetos consiste en pensar las soluciones a problemas como relaciones entre objetos:
- Herencia
- Composición
- Uso
Clases¶
Son agrupaciones de objetos del mismo tipo. Por ejemplo:
- Lucas
- Toby
Son perros, ambos comparten las características de un perro, pero se diferencian en su estado. Por ejemplo, Lucas tiene 10 años mientras Toby tiene 5 años. Es decir que ambos son instancias de una clase llamada Perro. Una instancia es darle valores específicos a los atributos de una clase.
Relaciones entre clases¶
Herencia¶
Muchas veces necesitamos definir una clase usando los atributos de otra. Por ejemplo:
- Perro de caza
- Perro doméstico
Ambos son grupos de perros, pero varían en sus propiedades y acciones.
Se dice que perro de caza y perro doméstico heredan características de la clase Perro, pero definen las suyas propias.
Composición¶
Una clase puede tener internamente en sus campos valores complejos que pueden ser representados por otras clases.
Un computador tiene un disco duro (capacidad, color, peso, etc.), tiene memoria (con sus características), pantalla (marca, modelo, etc.), etc.
Uso¶
Es una relación entre clases en la cual una utiliza métodos de la otra, pero no la compone.
- Persona
- Guitarra
¿Qué hace una persona con una guitarra? Puede tocarla, pero la guitarra no hace parte de la persona.
Otros tipos de relaciones¶
Polimorfismo¶
En el contexto de herencia significa que una subclase (clase hija) tiene métodos que hereda de una clase padre, pero al invocarlos puede darse un comportamiento diferente.
# Clase padre que define la estructura básica de un animal
class Animal:
def __init__(self, nombre, edad):
# Constructor que inicializa los atributos básicos
self.nombre = nombre
self.edad = edad
def emitir_sonido(self):
# Método que será sobrescrito por las clases hijas
return "muhaha"
# Clase hija que hereda de Animal
class Reptil(Animal):
def __init__(self, nombre, edad):
# Llamada al constructor de la clase padre
super().__init__(nombre, edad)
def emitir_sonido(self):
# Implementación específica para reptiles
return "grrrr"
# Otra clase hija que hereda de Animal
class Mamifero(Animal):
def __init__(self, nombre, edad):
# Llamada al constructor de la clase padre
super().__init__(nombre, edad)
def emitir_sonido(self):
# Implementación específica para mamíferos
return "auuuuuuuuu"
# Bloque principal de ejecución
if __name__ == "__main__":
# Creación de instancias de las clases hijas
animalA = Reptil("Juan", 32)
animalB = Mamifero("Pedro", 10)
# Demostración del polimorfismo: mismo método, comportamientos diferentes
print(animalA.emitir_sonido()) # Output: grrrr
print(animalB.emitir_sonido()) # Output: auuuuuuuuu
Al ejecutar este código vemos lo siguiente:
grrrr
auuuuuuuuu
Vemos que el comportamiento de emitir_sonido cambia de acuerdo a la implementación dada por las clases hijas, siendo que ambos objetos son de tipo Animal.
Características de los objetos¶
-
Propiedad de encapsulación: Puedo controlar la gestión (acceso o modificación) del estado usando los métodos. Dentro de esto aparecen los modificadores de alcance: public, private y protected.
-
Clases agrupan objetos: Las clases definen el molde para crear múltiples objetos con las mismas características.
-
La herencia permite generar nuevas clases a partir de las anteriores: Facilita la reutilización de código y la creación de jerarquías.
-
El polimorfismo permite que objetos de la misma clase puedan tener un comportamiento diferente: Mismo método, diferentes implementaciones.
Conceptos adicionales importantes¶
Abstracción¶
La capacidad de representar características esenciales de un objeto sin incluir detalles de implementación.
Encapsulación¶
El ocultamiento de los detalles internos de implementación de un objeto, exponiendo solo una interfaz pública.
Modularidad¶
La división del sistema en partes más pequeñas y manejables (módulos o clases) que pueden ser desarrolladas y mantenidas independientemente.
Tabla de resumen de conceptos de POO¶
| Concepto | Definición | Ejemplo |
|---|---|---|
| Objeto | Entidad que combina estado y comportamiento | Un perro con edad=5 y método ladrar() |
| Clase | Molde o plantilla para crear objetos | Clase Perro define atributos y métodos comunes |
| Instancia | Objeto específico creado a partir de una clase | Lucas (perro de 10 años) |
| Herencia | Mecanismo para crear nuevas clases basadas en existentes | PerroDeCaza hereda de Perro |
| Polimorfismo | Capacidad de objetos de responder al mismo mensaje de forma diferente | emitir_sonido() produce "grrrr" en Reptil y "auuu" en Mamifero |
| Encapsulación | Ocultamiento de detalles internos del objeto | Atributos privados con métodos públicos de acceso |
| Composición | Relación donde una clase contiene objetos de otras clases | Computador contiene DiscoDuro, Memoria, Pantalla |
| Abstracción | Representación simplificada de la realidad | Clase Vehículo sin detalles de motor específico |
| Modularidad | División del sistema en partes independientes | Separación en clases distintas para cada responsabilidad |
Comentarios adicionales¶
- La programación orientada a objetos mejora la mantenibilidad y reutilización del código
- El principio de responsabilidad única sugiere que cada clase debe tener una única responsabilidad
- Las relaciones entre clases deben diseñarse cuidadosamente para evitar acoplamiento excesivo
- Los patrones de diseño son soluciones recurrentes a problemas comunes en POO
- La sobrecarga de métodos permite múltiples implementaciones con diferentes parámetros
- Las interfaces definen contratos que las clases deben implementar sin especificar cómo
- La cohesión mide cómo se relacionan las responsabilidades dentro de una clase