Modulo 9: Programación Orientada a Objetos (POO)
▸ python-desde-cero/programacion-orientada-objetos
@yoezequiel 07-03-2025
3️⃣6️⃣ Introducción a la POO: ¿Qué es y por qué usarla?
🔹 ¿Qué es la Programación Orientada a Objetos (POO)?
- Un paradigma de programación basado en la organización del código en objetos.
- Un objeto es una instancia de una clase, que es una plantilla para crear objetos.
- Permite modelar entidades del mundo real con atributos (datos) y métodos (acciones).
🔹 ¿Por qué usar POO?
✅ Organización y reutilización del código
✅ Mantenibilidad y escalabilidad
✅ Modularidad y abstracción
3️⃣7️⃣ Clases y objetos: Definición y uso
🔹 Definiendo una clase y creando un objeto
class Persona:
pass # Clase vacía
p1 = Persona() # Creando un objeto
print(type(p1)) # <class '__main__.Persona'>
🔹 Ejemplo con atributos
class Persona:
def __init__(self, nombre, edad):
self.nombre = nombre
self.edad = edad
p1 = Persona("Juan", 30)
print(p1.nombre) # Juan
print(p1.edad) # 30
3️⃣8️⃣ Atributos y métodos de instancia
📌 Atributos de instancia
- Son variables asociadas a un objeto y definidas dentro del método
__init__
.
class Coche:
def __init__(self, marca, modelo):
self.marca = marca
self.modelo = modelo
mi_coche = Coche("Toyota", "Corolla")
print(mi_coche.marca) # Toyota
📌 Métodos de instancia
- Funciones dentro de la clase que operan sobre los atributos del objeto.
class Coche:
def __init__(self, marca, modelo):
self.marca = marca
self.modelo = modelo
def mostrar_info(self):
return f"Marca: {self.marca}, Modelo: {self.modelo}"
mi_coche = Coche("Ford", "Fiesta")
print(mi_coche.mostrar_info()) # Marca: Ford, Modelo: Fiesta
3️⃣9️⃣ Métodos especiales (__init__
, __str__
)
📌 Método __init__
(constructor)
- Se ejecuta al crear un objeto de la clase.
class Persona:
def __init__(self, nombre):
self.nombre = nombre
p1 = Persona("Ana")
📌 Método __str__
(representación amigable)
- Define cómo se mostrará el objeto al imprimirlo.
class Persona:
def __init__(self, nombre):
self.nombre = nombre
def __str__(self):
return f"Persona: {self.nombre}"
p1 = Persona("Ana")
print(p1) # Persona: Ana
4️⃣0️⃣ Encapsulamiento (public
, _protected
, __private
)
📌 Modificadores de acceso
- Público (
public
): Se puede acceder desde cualquier parte. - Protegido (
_protected
): Se indica con_
y se debe tratar como privado. - Privado (
__private
): Se indica con__
y no es accesible directamente.
class Ejemplo:
def __init__(self):
self.publico = "Público"
self._protegido = "Protegido"
self.__privado = "Privado"
e = Ejemplo()
print(e.publico) # OK
print(e._protegido) # OK, pero no recomendado
print(e.__privado) # ERROR
4️⃣2️⃣ Herencia: Clases padre e hijas
📌 Definiendo herencia en Python
- Una clase hija hereda atributos y métodos de una clase padre.
class Animal:
def hablar(self):
return "Hace un sonido"
class Perro(Animal):
def hablar(self):
return "Ladra"
p = Perro()
print(p.hablar()) # Ladra
4️⃣3️⃣ Polimorfismo y sobreescritura de métodos
📌 Polimorfismo: Un mismo método con diferentes implementaciones
class Gato(Animal):
def hablar(self):
return "Maulla"
animales = [Perro(), Gato()]
for animal in animales:
print(animal.hablar())
4️⃣4️⃣ Composición y Agregación de clases
📌 Composición: Un objeto dentro de otro
- Un objeto es parte de otro objeto.
class Motor:
def __init__(self, tipo):
self.tipo = tipo
class Coche:
def __init__(self, marca, motor):
self.marca = marca
self.motor = Motor(motor)
mi_coche = Coche("Toyota", "Eléctrico")
print(mi_coche.motor.tipo) # Eléctrico