Programación Orientada a
Objetos en Python
IN1010 – Programación I: Introducción
Ingeniería Civil Industrial – Universidad de Aysén
Prof. Enrique Urra – [Link]@[Link]
IN1010 – [Link]@[Link]
Conceptos básicos
2
IN1010 – [Link]@[Link]
Conceptos básicos
Paradigma de programación
❑ Conjunto de conceptos que
permiten resolver problemas
determinados
❑ Estos conceptos se asocian a
funcionalidades o herramientas de
los lenguajes
IN1010 – [Link]@[Link] 3
Conceptos básicos
Filas: Lenguajes
Columnas: Paradigmas
IN1010 – [Link]@[Link] 4
Conceptos básicos
Orientados
a Objetos
Python
IN1010 – [Link]@[Link] 5
Conceptos básicos
Programación Orientación a Objetos (POO)
❑ Representación de conceptos de un problema a
través de clases, describiendo tanto los atributos
como las operaciones que se pueden realizar sobre
dichos conceptos
❑ Desde las clases definidas se crean y utilizan
objetos, los cuales son las instancias específicas de
las clases
IN1010 – [Link]@[Link] 6
Conceptos básicos
Programación Orientación a Objetos (POO)
Clase Objetos
Instanciar
IN1010 – [Link]@[Link] 7
Conceptos básicos
Programación Orientación a Objetos (POO)
Objetos
Clase BolaHelado
• Azul
• Chirimoya
• Color
• Naranjo
• Sabor • Lúcuma
• Rosado
• Frutilla
IN1010 – [Link]@[Link] 8
Conceptos básicos
Un programa en Python que usa POO, por lo general, se
compone de dos elementos:
[Link] [Link]
class BolaHelado: from bolahelado import BolaHelado
def __init__(self, color, sabor):
[Link] = color bola1 = BolaHelado('Azul', 'Chirimoya')
[Link] = sabor
bola2 = BolaHelado('Naranjo', 'Lúcuma')
def comer(self): bola3 = BolaHelado('Rosado', 'Frutilla')
return ("Delicioso helado %s"
" de sabor %s" print([Link]())
% ([Link], [Link])) print([Link]())
print([Link]())
La definición de la(s) clase(s) La aplicación donde se utiliza la clase
asociada(s) al problema a resolver (en donde se instancian objetos de ella)
IN1010 – [Link]@[Link] 9
Conceptos básicos
Miembros de una clase
class BolaHelado: [Link]
def __init__(self, color, sabor):
[Link] = color
[Link] = sabor
def comer(self): Nota: Es una buena práctica
return ("Delicioso helado %s" definir las clases que usa un
" de sabor %s" programa en un archivo
% ([Link], [Link])) específico
IN1010 – [Link]@[Link] 10
Conceptos básicos
Miembros de una clase
Atributos
class BolaHelado:
def __init__(self, color, sabor): ❑ Representan las
[Link] = color “propiedades” (datos) de
[Link] = sabor una clase
def comer(self): ❑ Se definen y utilizan en
return ("Delicioso helado %s"
toda la clase a través de la
" de sabor %s"
% ([Link], [Link])) palabra self
IN1010 – [Link]@[Link] 11
Conceptos básicos
Miembros de una clase
Constructor(es)
class BolaHelado: ❑ Operación que permite
def __init__(self, color, sabor): instanciar un objeto desde
[Link] = color la clase
[Link] = sabor
❑ Recibe los parámetros
def comer(self):
necesarios para inicializar
los atributos de la instancia
return ("Delicioso helado %s"
(objeto) que se está
" de sabor %s" creando
% ([Link], [Link]))
IN1010 – [Link]@[Link] 12
Conceptos básicos
Miembros de una clase
Método(s)
class BolaHelado:
❑ Operaciones que pueden
def __init__(self, color, sabor):
[Link] = color
ser invocadas sobre un
[Link] = sabor objeto
❑ Por lo general, operan
def comer(self): sobre los mismos atributos,
return ("Delicioso helado %s" ya sea utilizando sus
" de sabor %s" valores o cambiándolos
% ([Link], [Link]))
IN1010 – [Link]@[Link] 13
Conceptos básicos
Utilización de objetos
from bolahelado import BolaHelado [Link]
bola1 = BolaHelado('Azul', 'Chirimoya')
bola2 = BolaHelado('Naranjo', 'Lúcuma')
bola3 = BolaHelado('Rosado', 'Frutilla')
Nota: Toda aplicación que utilice
print([Link]())
clases debe referenciar al archivo
print([Link]())
que la contiene, a través de la
print([Link]())
instrucción import
IN1010 – [Link]@[Link] 14
Conceptos básicos
Utilización de objetos
Creación de objetos
from bolahelado import BolaHelado ❑ Al utilizar el nombre de la
clase como una función, se
bola1 = BolaHelado('Azul', 'Chirimoya') invoca el constructor de
bola2 = BolaHelado('Naranjo', 'Lúcuma') dicha clase y se crea una
nueva instancia (objeto),
bola3 = BolaHelado('Rosado', 'Frutilla') con los parámetros que
sean necesarios
print([Link]())
❑ Para trabajar con los
print([Link]()) objetos, al crearlos, es
print([Link]()) necesario asignarlos a una
bola1 variable de referencia
bola2
IN1010 – [Link]@[Link]
bola3 15
Conceptos básicos
Utilización de objetos
Invocación de métodos
from bolahelado import BolaHelado ❑ Con las instancias
creadas, es posible
bola1 = BolaHelado('Azul', 'Chirimoya') invocar los métodos
bola2 = BolaHelado('Naranjo', 'Lúcuma') declarados en la clase,
bola3 = BolaHelado('Rosado', 'Frutilla') usando el operador de
invocación (punto)
print([Link]())
❑ El resultado de la
print([Link]()) invocación dependerá
print([Link]()) del objeto utilizado en la
invocación
[Link]() ¿Qué sale por pantalla?
IN1010 – [Link]@[Link] 16
Conceptos básicos
Actividad
❑ Crear una clase Estudiante, que tenga
distintos atributos que Ud. crea
convenientes, además de un método
presentarse(), el cual retorne un texto
con la presentación del estudiante
❑ Luego, genere una aplicación en donde
tenga al menos 3 referencias a estudiantes,
y en donde se muestre por pantalla la
presentación de cada uno
IN1010 – [Link]@[Link] 17
Manejo de estados
y referencias
18
IN1010 – [Link]@[Link]
Manejo de estados y referencias
Problema: Implemente una clase en Python que permita manejar la cuenta
corriente un cliente en un banco. Cada cuenta tiene como atributos el RUT del
cliente (String), el saldo actual y el número de transacciones (giros y/o
depósitos) realizados sobre la cuenta.
Al crear una cuenta, se debe solicitar el RUT respectivo. El saldo y el número
de transacciones parten en 0.
Implemente métodos en la clase para:
❑ Obtener el RUT, el saldo y el número de transacciones de la cuenta
❑ Depositar una cantidad de dinero en la cuenta
❑ Girar una cantidad de dinero en la cuenta, sólo si hay saldo suficiente.
IN1010 – [Link]@[Link] 19
Manejo de estados y referencias
Desarrollo: atributos y constructor
Único dato necesario
para crear una cuenta
class CuentaCorriente:
def __init__(self, rut):
self._rut = rut
self._saldo = 0
self._numTrans = 0
Nota: un estándar en Python es
colocar un guión abajo (underscore, o
‘_’) como prefijo para los nombres de
atributos que sólo deberían ser
manipulados dentro de la clase.
IN1010 – [Link]@[Link] 20
Manejo de estados y referencias
Desarrollo: método para obtener el RUT
@property
def rut(self):
return self._rut
Cómo estándar, un método que sólo
retorna el valor de un atributo se
denomina “propiedad”, y sobre su La sentencia return permite retonar un
definición se debe anteponer el resultado del método a quién lo invoque.
decorador @property: esto permite
que funcione como sólo-lectura
IN1010 – [Link]@[Link] 21
Manejo de estados y referencias
Desarrollo: método para girar
Cómo se observa, es posible
incorporar validaciones en los
métodos, de forma que, acorde al
def girar(self, monto): estado de sus atributos, las
if(self._saldo - monto >= 0): operaciones se ejecuten de una u
self._saldo -= monto otra forma
self._numTrans += 1
return True Note que cuando el método
ejecuta una instrucción return,
return False su ejecución es terminada
completamente en el punto en
donde el return está definido
IN1010 – [Link]@[Link] 22
Manejo de estados y referencias
Ahora… ¿Cómo usamos las cuentas?
Escriba una nueva aplicación que importe la clase
CuentaCorriente, e incrementalmente vaya
probando los siguientes códigos…
IN1010 – [Link]@[Link] 23
Manejo de estados y referencias
from cuenta import CuentaCorriente
c1 = CuentaCorriente('rut1')
¿Qué imprime por pantalla? [Link](100)
[Link](10)
print([Link])
Memoria del computador
IN1010 – [Link]@[Link] 24
Manejo de estados y referencias
from cuenta import CuentaCorriente
c1 = CuentaCorriente('rut1')
¿Qué imprime por pantalla? [Link](100)
[Link](10)
print([Link]) # 90
Memoria del computador
c1
_rut = “rut1“
_saldo = 90
_numTrans = 2
IN1010 – [Link]@[Link] 25
Manejo de estados y referencias
from cuenta import CuentaCorriente
c1 = CuentaCorriente('rut1')
¿Qué imprime por pantalla? [Link](100)
[Link](10)
print([Link])
Memoria del computador c2 = CuentaCorriente('rut2')
[Link](50)
c1 [Link](70)
_rut = “rut1“ print([Link])
_saldo = 90
_numTrans = 2
IN1010 – [Link]@[Link] 26
Manejo de estados y referencias
from cuenta import CuentaCorriente
c1 = CuentaCorriente('rut1')
¿Qué imprime por pantalla? [Link](100)
[Link](10)
print([Link])
Memoria del computador c2 = CuentaCorriente('rut2')
[Link](50)
c1 c2 [Link](70)
_rut = “rut1“ print([Link]) # 50
_saldo = 90
_numTrans = 2
_rut = “rut2“
_saldo = 50
_numTrans = 1
IN1010 – [Link]@[Link] 27
Manejo de estados y referencias
from cuenta import CuentaCorriente
c1 = CuentaCorriente('rut1')
¿Qué imprime por pantalla? [Link](100)
[Link](10)
print([Link])
Memoria del computador c2 = CuentaCorriente('rut2')
[Link](50)
c1 c2 [Link](70)
_rut = “rut1“ print([Link])
_saldo = 90
_numTrans = 2
c3 = c2
_rut = “rut2“ print([Link])
_saldo = 50
_numTrans = 2
IN1010 – [Link]@[Link] 28
Manejo de estados y referencias
from cuenta import CuentaCorriente
c1 = CuentaCorriente('rut1')
¿Qué imprime por pantalla? [Link](100)
[Link](10)
print([Link])
Memoria del computador c2 = CuentaCorriente('rut2')
[Link](50)
c1 c2 [Link](70)
_rut = “rut1“ print([Link])
_saldo = 90
_numTrans = 2
c3 = c2
_rut = “rut2“ print([Link]) # 50
_saldo = 50
_numTrans = 2
c3
IN1010 – [Link]@[Link] 29
Manejo de estados y referencias
from cuenta import CuentaCorriente
c1 = CuentaCorriente('rut1')
¿Qué imprime por pantalla? [Link](100)
[Link](10)
print([Link])
Memoria del computador c2 = CuentaCorriente('rut2')
[Link](50)
c1 c2 [Link](70)
_rut = “rut1“ print([Link])
_saldo = 90
_numTrans = 2
c3 = c2
_rut = “rut2“ print([Link])
_saldo = 50
_numTrans = 2
[Link](50)
c3 print([Link])
IN1010 – [Link]@[Link] 30
Manejo de estados y referencias
from cuenta import CuentaCorriente
c1 = CuentaCorriente('rut1')
¿Qué imprime por pantalla? [Link](100)
[Link](10)
print([Link])
Memoria del computador c2 = CuentaCorriente('rut2')
[Link](50)
c1 c2 [Link](70)
_rut = “rut1“ print([Link])
_saldo = 90
_numTrans = 2
c3 = c2
_rut = “rut2“ print([Link])
_saldo = 100
_numTrans = 3 [Link](50)
c3 print([Link]) # 100
IN1010 – [Link]@[Link] 31
Manejo de estados y referencias
from cuenta import CuentaCorriente
c1 = CuentaCorriente('rut1')
¿Qué imprime por pantalla? [Link](100)
[Link](10)
print([Link])
Memoria del computador c2 = CuentaCorriente('rut2')
[Link](50)
c1 c2 [Link](70)
_rut = “rut1“ print([Link])
_saldo = 90
_numTrans = 2
c3 = c2
_rut = “rut2“ print([Link])
_saldo = 100
_numTrans = 3
[Link](50)
c3 print([Link])
c1 = None
print([Link])
IN1010 – [Link]@[Link] 32
Manejo de estados y referencias
from cuenta import CuentaCorriente
c1 = CuentaCorriente('rut1')
¿Qué imprime por pantalla? [Link](100)
[Link](10)
print([Link])
Memoria del computador c2 = CuentaCorriente('rut2')
[Link](50)
c1 c2 [Link](70)
print([Link])
None
c3 = c2
_rut = “rut2“ print([Link])
_saldo = 100
_numTrans = 3
[Link](50)
c3 print([Link])
c1 = None
print([Link]) Error!!
IN1010 – [Link]@[Link] 33
Manejo de estados y referencias
Puede hacer el mismo ejercicio para un arreglo
de objetos de tipo CuentaCorriente
IN1010 – [Link]@[Link] 34
Manejo de estados y referencias
cuentas = [ None ] * 3
for i in range(len(cuentas)):
¿Qué imprime por pantalla? print(cuentas[i])
Memoria del computador
IN1010 – [Link]@[Link] 35
Manejo de estados y referencias
cuentas = [ None ] * 3
for i in range(len(cuentas)):
¿Qué imprime por pantalla? print(cuentas[i]) # None x 3
Memoria del computador
0 1 2
cuentas
None None None
IN1010 – [Link]@[Link] 36
Manejo de estados y referencias
cuentas = [ None ] * 3
for i in range(len(cuentas)):
¿Qué imprime por pantalla? print(cuentas[i])
cuentas[0] = CuentaCorriente('rut1')
cuentas[0].depositar(10)
Memoria del computador cuentas[1] = CuentaCorriente('rut2')
cuentas[1].depositar(20)
0 1 2
cuentas
None None None for i in range(len(cuentas)):
if(cuentas[i] != None):
print(cuentas[i].saldo)
IN1010 – [Link]@[Link] 37
Manejo de estados y referencias
cuentas = [ None ] * 3
for i in range(len(cuentas)):
¿Qué imprime por pantalla? print(cuentas[i])
cuentas[0] = CuentaCorriente('rut1')
cuentas[0].depositar(10)
Memoria del computador cuentas[1] = CuentaCorriente('rut2')
cuentas[1].depositar(20)
0 1 2
cuentas
None for i in range(len(cuentas)):
if(cuentas[i] != None):
print(cuentas[i].saldo) # 10, 20
_rut = “rut1“ _rut = “rut2“
_saldo = 10 _saldo = 20
_numTrans = 1 _numTrans = 1
IN1010 – [Link]@[Link] 38
Manejo de estados y referencias
cuentas = [ None ] * 3
for i in range(len(cuentas)):
¿Qué imprime por pantalla? print(cuentas[i])
cuentas[0] = CuentaCorriente('rut1')
cuentas[0].depositar(10)
Memoria del computador cuentas[1] = CuentaCorriente('rut2')
cuentas[1].depositar(20)
0 1 2
cuentas
None for i in range(len(cuentas)):
if(cuentas[i] != None):
print(cuentas[i].saldo)
cuentas[2] = cuentas[1]
_rut = “rut1“ _rut = “rut2“ print(cuentas[2].saldo)
_saldo = 10 _saldo = 20
_numTrans = 1 _numTrans = 1
IN1010 – [Link]@[Link] 39
Manejo de estados y referencias
cuentas = [ None ] * 3
for i in range(len(cuentas)):
¿Qué imprime por pantalla? print(cuentas[i])
cuentas[0] = CuentaCorriente('rut1')
cuentas[0].depositar(10)
Memoria del computador cuentas[1] = CuentaCorriente('rut2')
cuentas[1].depositar(20)
0 1 2
cuentas
for i in range(len(cuentas)):
if(cuentas[i] != None):
print(cuentas[i].saldo)
cuentas[2] = cuentas[1]
_rut = “rut1“ _rut = “rut2“ print(cuentas[2].saldo) # 20
_saldo = 10 _saldo = 20
_numTrans = 1 _numTrans = 1
IN1010 – [Link]@[Link] 40
Manejo de estados y referencias
Actividad práctica
Desarrolle un programa en Python que maneje un
arreglo de objetos CuentaCorriente de largo N
(solicitado al usuario en el inicio), en donde se
despliegue un menú que ofrezca las siguientes
funciones:
❑ Agregar un nuevo cliente, validando que su RUT
no se repita, y que haya espacio para ingresarlo.
❑ Depositar dinero en una cuenta, buscándola por su
RUT.
❑ Calcular el promedio de los saldos de las cuentas
ingresadas.
IN1010 – [Link]@[Link] 41
Programación Orientada a
Objetos en Python
IN1010 – Programación I: Introducción
Ingeniería Civil Industrial – Universidad de Aysén
Prof. Enrique Urra – [Link]@[Link]
IN1010 – [Link]@[Link]