Programación Orientada A Objetos (Poo)
Programación Orientada A Objetos (Poo)
Programación 2
| Al finalizar la clase, los estudiantes serán
capaces de utilizar los conceptos fundamentales
de la programación orientada a objetos para -Ia-
Inteligencia
crear programas eficientes y reutilizables. artificial y
Ciencia de
datos
En la POO, se utilizan clases para definir los objetos, las cuales son una especie de plantilla que
describe cómo se deben crear los objetos. Los objetos son instancias de estas clases, y cada uno
tiene su propia identidad, estado y comportamiento.
Conceptos fundamentales
| Clases: son estructuras que permiten definir un objeto y su comportamiento. Una clase describe
las propiedades y métodos que tienen todos los objetos de ese tipo. Por ejemplo, si creamos una
clase "Persona", podemos definir que todas las personas tienen un nombre y una edad, así como
métodos para obtener o modificar esos valores.
| Objetos: Los objetos son instancias de una clase. Cada objeto tiene sus propios atributos y
métodos, pero se construyen a partir de la misma plantilla (la clase). Por ejemplo, si creamos un
objeto "Juan" de la clase "Persona", tendrá su propio nombre y edad, pero se construirá a partir
de la misma plantilla que todos los demás objetos de la clase "Persona".
2
| Atributos: Los atributos son las propiedades de un objeto. Cada objeto tiene sus propios valores
de atributos, aunque pueden tener los mismos nombres que los atributos de otros objetos. Los
atributos se definen en la clase y se inicializan en el momento de la creación del objeto. Por
ejemplo, un atributo de la clase "Persona" podría ser el nombre o la edad.
| Métodos: Los métodos son las funciones que se definen en una clase y que se pueden invocar
en los objetos de esa clase. Son las acciones que puede realizar un objeto. Los métodos se definen
en la clase y se ejecutan en los objetos. Por ejemplo, un método de la clase "Persona" podría ser
"saludar", que imprimiría un mensaje de saludo.
| Herencia: es la capacidad de crear una nueva clase a partir de una clase existente,
manteniendo las características de la clase original y agregando nuevas características o
modificando las existentes. Por ejemplo, si creamos una clase "Estudiante" a partir de la
clase "Persona", podemos agregar nuevos atributos como la carrera o la nota promedio, pero
seguiríamos teniendo los atributos originales como el nombre y la edad.
| Encapsulamiento: es la capacidad de ocultar los detalles internos de una clase, para que
los objetos que la utilizan no necesiten conocer cómo está implementada la clase. Esto se logra
mediante la definición de métodos públicos y privados en la clase. Los métodos públicos son
aquellos que pueden ser llamados desde fuera de la clase, mientras que los métodos privados sólo
pueden ser llamados desde dentro de la clase.
4
En este ejemplo, hemos creado una clase llamada Perro. Aquí está una explicación detallada:
3 | Luego, definimos un método llamado ladrar. Este método simplemente imprime un mensaje que
indica que el perro está ladrando.
5 | Accedemos a los atributos nombre y raza de mi_perro utilizando la notación de punto (mi_
perro.nombre y mi_perro.raza) y los almacenamos en variables.
7 | Finalmente, llamamos al método ladrar en mi_perro, lo que hace que el perro ladre y se
imprima el mensaje correspondiente.
Probablemente te parece confuso en este momento, pero vamos a seguir analizando cada uno de
estos conceptos y poco a poco el panorama se va a aclarar.
5
Clases y Objetos
Las clases y objetos son conceptos fundamentales de la programación orientada a objetos (POO),
que permite modelar objetos del mundo real en el software.
Una clase es una plantilla o molde que define las propiedades y comportamientos comunes a un
conjunto de objetos. Por otro lado, un objeto es una instancia o ejemplar particular de una clase
que tiene sus propias propiedades y comportamientos.
6
Creación de una clase básica con atributos y métodos
La sintaxis básica para crear una clase en la mayoría de los lenguajes de programación orientados a
objetos es la siguiente:
class NombreClase:
def __init__(self, atributol, atributo2, ...):
self.atributo1 = atributo1
self.atributo2 = atributo2
...
def metodo1(self, parametro1, parametro2, ...):
# Código del método
...
def metodo2(self, parametro1, parametro2, ...):
# Código del método
...
Donde __init__ es un método especial que se llama constructor y se utiliza para inicializar los
atributos de la clase. Los métodos son funciones que definen los comportamientos de los objetos.
7
Ejemplo de creación de objetos a partir de una clase
Supongamos que queremos crear una clase Persona con los atributos nombre, edad y altura y los
métodos presentarse y cumplir_anios. La definición de la clase sería la siguiente:
class Persona:
def __init__(self, nombre, edad, altura):
self.nombre = nombre
self.edad = edad
self.altura = altura
def presentarse(self):
print(f'Mi nombre es ¨{self.nombre} y mido {self.altura}
metros')
def cumplir_anios(self):
self.edad += 1
print(f'¡Feliz cumpleaños! Ahora tengo {self.edad} años')
8
Para crear un objeto de esta clase, podemos hacer lo siguiente:
Este código crea un objeto llamado persona1 de la clase Persona con los valores Juan para el
atributo nombre, 25 para el atributo edad y 1.75 para el atributo altura.
Podemos llamar a los métodos de la clase para que el objeto haga algo:
9
Desempeño 1
| Crear una clase Perro con los atributos nombre, raza y edad y los
métodos ladrar y envejecer. Crear un objeto de la clase Perro llamado
perro1 y llamar a los métodos del objeto perro1.
Solución
class Perro:
def __init__(self, nombre, raza, edad):
self.nombre = nombre
self.raza = raza
self.edad = edad
def ladrar(self):
print(f'{self.nombre} está ladrando')
def envejecer(self):
self.edad += 1
print(f'{self.nombre} cumplió años
perro1 = Perro("Fido", "Labrador", 5)
perro1.ladrar() # Imprime: ¡Guau, guau!
perro1.envejecer(1)
print(perro1.edad) # Imprime: 6
11
En este ejemplo, hemos creado un objeto de la clase Perro llamado perro1 con los atributos
nombre, raza y edad. El método ladrar imprime un mensaje de ladrido por la consola, mientras
que el método envejecer actualiza la edad del perro sumando la cantidad de años que se le pase
como argumento. Finalmente, hemos llamado a ambos métodos del objeto perro1 para comprobar
que funcionan correctamente.
Este ejercicio es una simple aplicación de la creación de clases y objetos en Python, sin embargo,
podríamos extender esta clase con nuevos métodos y atributos para hacerla más útil en un
contexto de inteligencia artificial o machine learning, por ejemplo, si quisiéramos utilizar la clase
Perro para crear un modelo de clasificación de imágenes de perros basado en su raza.
12
Atributos y Métodos
En Python, una clase es una plantilla que define la estructura y el comportamiento de un objeto.
Los objetos se crean a partir de una clase y contienen atributos (variables) y métodos (funciones).
Los atributos son las características de un objeto, mientras que los métodos son las acciones que
el objeto puede realizar.
Los atributos son las variables que definen las características de un objeto, mientras que los
métodos son las funciones que definen las acciones que un objeto puede realizar.
| Atributos de instancia: Son los atributos que se definen dentro del método constructor de la
clase y que pertenecen a una instancia específica de la clase. Estos atributos pueden ser accedidos y
modificados por los métodos de la instancia.
| Atributos de clase: Son los atributos que se definen fuera de cualquier método de la clase y
que pertenecen a la clase en sí misma. Estos atributos pueden ser accedidos y modificados por
cualquier instancia de la clase.
13
| Métodos de instancia: Son los métodos que operan en las instancias de una clase y que pueden
acceder y modificar los atributos de instancia. Estos métodos son llamados a través de una
instancia de la clase.
| Métodos de clase: Son los métodos que operan en la clase en sí misma y que pueden acceder y
modificar los atributos de clase. Estos métodos son llamados a través de la clase en sí misma.
class Persona:
def __init__(self, nombre, edad):
self.nombre = nombre
self.edad = edad
def hablar(self, mensaje):
print(self.nombre + " dice: " + mensaje)
def envejecer(self, años):
self.edad += años
En este ejemplo, hemos creado la clase Persona con dos atributos de instancia:
nombre y edad, y dos métodos de instancia: hablar y envejecer. El método init es
el constructor de la clase y se utiliza para inicializar los atributos de instancia. El
método hablar recibe un mensaje y lo imprime en la consola, mientras que el método
envejecer recibe una cantidad de años y actualiza la edad de la persona.
14
Para crear un objeto de la clase Persona y llamar a sus métodos, podemos hacer lo siguiente:
En este caso, hemos creado un objeto de la clase Persona llamado p con los atributos de
instancia nombre y edad, y hemos llamado a los métodos hablar y envejecer del objeto. También
hemos impreso la edad actual del objeto en la consola.
15
Desempeño 2
Creemos una clase Coche con los atributos marca, modelo y velocidad y
los métodos acelerar y frenar.
Solución
class Coche:
def __init__(self, marca, modelo):
self.marca = marca
self.modelo = modelo
self.velocidad = 0
def acelerar (self, velocidad):
self.velocidad += velocidad
def frenar(self, velocidad):
self.velocidad -= velocidad
En este ejemplo, hemos creado la clase Coche con tres atributos de instancia: marca, modelo
y velocidad, y dos métodos de instancia: acelerar y frenar. El método init es el constructor de la
clase y se utiliza para inicializar los atributos de instancia. El método acelerar recibe una velocidad
y aumenta la velocidad actual del coche, mientras que el método frenar recibe una velocidad y
disminuye la velocidad actual del coche.
17
Para crear un objeto de la clase Coche y llamar a sus métodos, podemos hacer lo siguiente:
c = Coche("Ford", "Mustang")
print(c.marca, c.modelo, c.velocidad) # Imprime: Ford Mustang 0
c.acelerar(50)
print(c.velocidad) # Imprime: 50
c.frenar(20)
print(c.velocidad) # Imprime: 30
En este caso, hemos creado un objeto de la clase Coche llamado c con los atributos de instancia
marca, modelo y velocidad, y hemos llamado a los métodos acelerar y frenar del objeto. También
hemos impreso la marca, modelo y velocidad actual del objeto en la consola.
18
Herencia
En la herencia, la clase existente se conoce como la clase base o padre, y la nueva clase se conoce
como la clase derivada o hija. La clase hija hereda los atributos y métodos de la clase base, lo que
permite reutilizar el código y evitar la duplicación innecesaria.
Para crear una clase que hereda de otra clase existente, se utiliza la sintaxis "class
ClaseHija(ClasePadre):". La clase hija hereda todos los atributos y métodos de la clase padre, y
puede agregar nuevos atributos y métodos, o sobrescribir los existentes.
19
class Vehiculo:
def __init__(self, marca, modelo, color):
self.marca = marca
self.modelo = modelo
self.color = color
def mostrar_info(self):
print("Marca:", self.marca)
print("Modelo:", self.modelo)
print("Color:", self.color)
class Coche(Vehiculo):
def __init__(self, marca, modelo, color, num_puertas):
super().__init__(marca, modelo, color)
self.num_puertas = num_puertas
def mostrar_info(self):
super().mostrar_info()
print("Número de puertas:", self.num_puertas)
En este ejemplo, se define una clase base "Vehiculo" que tiene los atributos "marca",
"modelo" y "color", y un método "mostrar_info" que muestra la información
del vehículo. Luego, se define una clase hija "Coche" que hereda de la clase
"Vehiculo" y agrega un nuevo atributo "num_puertas". Además, se sobrescribe
el método "mostrar_info" para mostrar también el número de puertas.
20
Sobrescritura de métodos de la clase base en la clase hija
21
Supongamos que tenemos una clase "Animal" que tiene como atributos "nombre" y "edad", y
un método "hacer_sonido". Luego, podemos crear una clase "Perro" que hereda de "Animal" y
agrega su propio atributo "raza" y su propio método "ladrar".
class Animal:
def __init__(self, nombre, edad):
self.nombre = nombre
self.edad = edad
def hacer_sonido(self):
print("Sonido genérico")
class Perro(Animal):
def __init__(self, nombre, edad, raza):
super().__init__(nombre, edad)
self.raza = raza
def hacer_sonido(self):
print("Guau!")
def ladrar(self):
print("El perro está ladrando.")
22
Encapsulamiento
Los modificadores de acceso son palabras clave utilizadas para especificar los niveles de acceso
a los miembros de una clase. Hay tres modificadores de acceso en la mayoría de los lenguajes de
programación orientados a objetos: public, private y protected.
| public: cualquier objeto puede acceder al miembro desde cualquier lugar del programa.
El encapsulamiento permite una mejor organización y modularidad del código, ya que los objetos
pueden interactuar con otros objetos a través de interfaces bien definidas en lugar de acceder
directamente a los datos internos de los objetos.
23
Un ejemplo de uso de encapsulamiento en una clase puede ser una clase "Cuenta Bancaria".
Los datos de la cuenta bancaria, como el saldo y el número de cuenta, se pueden ocultar utilizando
el modificador de acceso privado. Los métodos públicos, como depositar y retirar dinero, pueden
acceder a estos datos y realizar operaciones en la cuenta bancaria. Sin embargo, los objetos
externos no pueden acceder directamente al saldo o al número de cuenta.
class Persona:
def __init__(self, nombre, edad):
self.__nombre = nombre
self.__edad = edad
def get_nombre(self):
return self.__nombre
def get_edad(self):
return self.__edad
def set_nombre(self, nombre):
self.__nombre = nombre
def set_edad(self, edad):
self.__edad = edad
24
En este ejemplo, la clase "Persona" tiene dos atributos privados, "__nombre" y "__edad". Los
métodos públicos "get_nombre", "get_edad", "set_nombre" y "set_edad" se utilizan para
acceder y modificar estos atributos de forma segura y controlada.
25
Desempeño 3
class Rectangulo:
def__init__(self, base, altura):
self.__base = base
self.__altura = altura
def obtener_base(self):
return self.__base
def obtener_altura(self):
return self.__altura
def establecer_base(self, base):
self.__base = base
def establecer_altura(self, altura):
self.__altura = altura
En este ejemplo, la clase "Rectangulo" tiene dos atributos privados, "__base" y "__altura", que
se inicializan en el constructor "init". Los métodos públicos "obtener_base", "obtener_altura",
"establecer_base" y "establecer_altura" se utilizan para acceder y modificar los atributos de
forma segura y controlada.
27
Polimorfismo
En la práctica, esto significa que podemos utilizar un objeto en diferentes contextos, y que su
comportamiento variará en función de cómo se está utilizando. El polimorfismo se utiliza para
simplificar el código y reducir la complejidad.
Crea una clase "Vehículo" que tenga un método "mover". Luego, crea varias clases hijas como
"Coche", "Camión" y "Bicicleta", que sobrescriben el método "mover" para imprimir un mensaje
que describa cómo se mueve cada vehículo.
Por ejemplo, la clase "Coche" podría tener un método "mover" que imprima el mensaje "El
coche se mueve sobre cuatro ruedas", mientras que la clase "Bicicleta" podría tener un método
"mover" que imprima el mensaje "La bicicleta se mueve pedaleando".
28
Luego, crea objetos de cada clase y llama al método "mover" de la clase "Vehículo". Verifica que
el mensaje impreso sea el correspondiente a cada tipo de vehículo.
Solución
class Vehiculo:
det mover(self):
pass
class Coche (Vehiculo):
def mover(self):
print("El coche se mueve sobre cuatro ruedas")
class Camion(Vehiculo):
def mover(self):
print("El camión se mueve sobre seis ruedas")
class Bicicleta(Vehiculo):
def mover(self):
print("La bicicleta se mueve pedaleando")
# Creamos objetos de cada clase hija y llamamos al método mover de
la clase Vehiculo
coche = Coche()
coche.mover()
camion = Camion()
camion.mover()
bicicleta = Bicicleta()
bicicleta.mover()
29
Este código es un ejemplo de cómo implementar polimorfismo en Python. En este caso, se define
una clase base llamada "Vehiculo" con un método "mover" que no hace nada (solo tiene la
instrucción "pass" dentro de él).
Luego, se definen tres clases hijas: "Coche", "Camion" y "Bicicleta", que heredan de la clase
base "Vehiculo" y sobrescriben el método "mover" para imprimir un mensaje que describe cómo
se mueve cada vehículo. Finalmente, se crean objetos de cada clase hija ("Coche", "Camion" y
"Bicicleta") y se llama al método "mover" de la clase base "Vehiculo".
30
¡Felicitaciones!
Elige uno de los ejercicios para presentar como actividad de la semana, y luego realiza los otros para
que practiques lo aprendido en esta clase. Recuerda que “la programación es práctica, práctica y
más práctica”
31
Desempeño 4
1| Crea una clase Persona con los atributos nombre y edad, y los 3| Crea una clase Empleado con los atributos nombre y salario, y el
métodos obtener_nombre() y obtener_edad(). Luego, crea una clase método obtener_salario(). Luego, crea una clase hija Gerente que
hija Estudiante que agregue el atributo promedio y el método obtener_ agregue el atributo bono y el método obtener_bono(). Crea objetos
promedio(). Crea objetos de ambas clases y llama a sus métodos para de ambas clases y llama a sus métodos para imprimir los atributos
imprimir los atributos correspondientes. correspondientes.
2| Crea una clase Mascota con los atributos nombre y edad, y el método 4| Crea una clase Figura con los atributos lado1 y lado2, y los métodos
sonar(), que imprima el sonido de la mascota. Luego, crea clases hijas obtener_area() y obtener_perimetro(). Luego, crea clases hijas para
para diferentes tipos de mascotas, como Perro, Gato y Pájaro, que diferentes tipos de figuras, como Rectangulo, Circulo y Triangulo, que
sobrescriban el método sonar() para imprimir el sonido correspondiente sobrescriban los métodos obtener_area() y obtener_perimetro() para
a cada tipo de mascota. calcular los valores correspondientes a cada tipo de figura.
5| Crea una clase Vehiculo con los atributos marca, modelo y precio,
y el método obtener_precio(). Luego, crea una clase hija Coche que
agregue el atributo color y el método obtener_color(). Crea objetos
de ambas clases y llama a sus métodos para imprimir los atributos
correspondientes.
Créditos
Imágenes
Tipografía
Para este diseño se utilizó la tipografía Source Sans Pro diseñada por Paul D. Hunt. y
Space Mono diseñada por Colophon Foundry Extraída de Google Fonts.
Si detectás un error del tipo que fuere (falta un punto, un acento, una palabra
mal escrita, un error en código, etc.), por favor comunicate con nosotros a
[email protected] e indicanos por cada error que detectes la página
y el párrafo. Muchas gracias por tu aporte.