You are on page 1of 42

Programación Orientada a

Objetos en Python
IN1010 – Programación I: Introducción
Ingeniería Civil Industrial – Universidad de Aysén
Prof. Enrique Urra – enrique.urra@uaysen.cl

IN1010 – enrique.urra@uaysen.cl
Conceptos básicos
2
IN1010 – enrique.urra@uaysen.cl
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 – enrique.urra@uaysen.cl 3
Conceptos básicos

Filas: Lenguajes

Columnas: Paradigmas

IN1010 – enrique.urra@uaysen.cl 4
Conceptos básicos

Orientados
a Objetos

Python

IN1010 – enrique.urra@uaysen.cl 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 – enrique.urra@uaysen.cl 6
Conceptos básicos

Programación Orientación a Objetos (POO)

Clase Objetos

Instanciar

IN1010 – enrique.urra@uaysen.cl 7
Conceptos básicos

Programación Orientación a Objetos (POO)
Objetos
Clase BolaHelado
• Azul
• Chirimoya

• Color
• Naranjo
• Sabor • Lúcuma

• Rosado
• Frutilla

IN1010 – enrique.urra@uaysen.cl 8
Conceptos básicos

Un programa en Python que usa POO, por lo general, se
compone de dos elementos:
bolahelado.py main.py
class BolaHelado: from bolahelado import BolaHelado
def __init__(self, color, sabor):
self.color = color bola1 = BolaHelado('Azul', 'Chirimoya')
self.sabor = sabor
bola2 = BolaHelado('Naranjo', 'Lúcuma')
def comer(self): bola3 = BolaHelado('Rosado', 'Frutilla')
return ("Delicioso helado %s"
" de sabor %s" print(bola1.comer())
% (self.color, self.sabor)) print(bola2.comer())
print(bola3.comer())

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 – enrique.urra@uaysen.cl 9
Conceptos básicos

Miembros de una clase

class BolaHelado: bolahelado.py
def __init__(self, color, sabor):
self.color = color
self.sabor = 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
% (self.color, self.sabor)) específico

IN1010 – enrique.urra@uaysen.cl 10
Conceptos básicos

Miembros de una clase
Atributos
class BolaHelado:
def __init__(self, color, sabor): ❑ Representan las
self.color = color “propiedades” (datos) de
self.sabor = 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"
% (self.color, self.sabor)) palabra self

IN1010 – enrique.urra@uaysen.cl 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
self.color = color la clase
self.sabor = 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
% (self.color, self.sabor))

IN1010 – enrique.urra@uaysen.cl 12
Conceptos básicos

Miembros de una clase
Método(s)
class BolaHelado:
❑ Operaciones que pueden
def __init__(self, color, sabor):
self.color = color
ser invocadas sobre un
self.sabor = 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
% (self.color, self.sabor))

IN1010 – enrique.urra@uaysen.cl 13
Conceptos básicos

Utilización de objetos

from bolahelado import BolaHelado main.py
bola1 = BolaHelado('Azul', 'Chirimoya')
bola2 = BolaHelado('Naranjo', 'Lúcuma')
bola3 = BolaHelado('Rosado', 'Frutilla')
Nota: Toda aplicación que utilice
print(bola1.comer())
clases debe referenciar al archivo
print(bola2.comer())
que la contiene, a través de la
print(bola3.comer())
instrucción import

IN1010 – enrique.urra@uaysen.cl 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(bola1.comer())
❑ Para trabajar con los
print(bola2.comer()) objetos, al crearlos, es
print(bola3.comer()) necesario asignarlos a una
bola1 variable de referencia
bola2
IN1010 – enrique.urra@uaysen.cl
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(bola1.comer())
❑ El resultado de la
print(bola2.comer()) invocación dependerá
print(bola3.comer()) del objeto utilizado en la
invocación
bola1.comer() ¿Qué sale por pantalla?
IN1010 – enrique.urra@uaysen.cl 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 – enrique.urra@uaysen.cl 17
Manejo de estados
y referencias
18
IN1010 – enrique.urra@uaysen.cl
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 – enrique.urra@uaysen.cl 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 – enrique.urra@uaysen.cl 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 – enrique.urra@uaysen.cl 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 – enrique.urra@uaysen.cl 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 – enrique.urra@uaysen.cl 23
Manejo de estados y referencias

from cuenta import CuentaCorriente

c1 = CuentaCorriente('rut1')
¿Qué imprime por pantalla? c1.depositar(100)
c1.girar(10)
print(c1.saldo)

Memoria del computador

IN1010 – enrique.urra@uaysen.cl 24
Manejo de estados y referencias

from cuenta import CuentaCorriente

c1 = CuentaCorriente('rut1')
¿Qué imprime por pantalla? c1.depositar(100)
c1.girar(10)
print(c1.saldo) # 90

Memoria del computador

c1
_rut = “rut1“
_saldo = 90
_numTrans = 2

IN1010 – enrique.urra@uaysen.cl 25
Manejo de estados y referencias

from cuenta import CuentaCorriente

c1 = CuentaCorriente('rut1')
¿Qué imprime por pantalla? c1.depositar(100)
c1.girar(10)
print(c1.saldo)

Memoria del computador c2 = CuentaCorriente('rut2')
c2.depositar(50)
c1 c2.girar(70)
_rut = “rut1“ print(c2.saldo)
_saldo = 90
_numTrans = 2

IN1010 – enrique.urra@uaysen.cl 26
Manejo de estados y referencias

from cuenta import CuentaCorriente

c1 = CuentaCorriente('rut1')
¿Qué imprime por pantalla? c1.depositar(100)
c1.girar(10)
print(c1.saldo)

Memoria del computador c2 = CuentaCorriente('rut2')
c2.depositar(50)
c1 c2 c2.girar(70)
_rut = “rut1“ print(c2.saldo) # 50
_saldo = 90
_numTrans = 2

_rut = “rut2“
_saldo = 50
_numTrans = 1

IN1010 – enrique.urra@uaysen.cl 27
Manejo de estados y referencias

from cuenta import CuentaCorriente

c1 = CuentaCorriente('rut1')
¿Qué imprime por pantalla? c1.depositar(100)
c1.girar(10)
print(c1.saldo)

Memoria del computador c2 = CuentaCorriente('rut2')
c2.depositar(50)
c1 c2 c2.girar(70)
_rut = “rut1“ print(c2.saldo)
_saldo = 90
_numTrans = 2
c3 = c2
_rut = “rut2“ print(c3.saldo)
_saldo = 50
_numTrans = 2

IN1010 – enrique.urra@uaysen.cl 28
Manejo de estados y referencias

from cuenta import CuentaCorriente

c1 = CuentaCorriente('rut1')
¿Qué imprime por pantalla? c1.depositar(100)
c1.girar(10)
print(c1.saldo)

Memoria del computador c2 = CuentaCorriente('rut2')
c2.depositar(50)
c1 c2 c2.girar(70)
_rut = “rut1“ print(c2.saldo)
_saldo = 90
_numTrans = 2
c3 = c2
_rut = “rut2“ print(c3.saldo) # 50
_saldo = 50
_numTrans = 2

c3

IN1010 – enrique.urra@uaysen.cl 29
Manejo de estados y referencias

from cuenta import CuentaCorriente

c1 = CuentaCorriente('rut1')
¿Qué imprime por pantalla? c1.depositar(100)
c1.girar(10)
print(c1.saldo)

Memoria del computador c2 = CuentaCorriente('rut2')
c2.depositar(50)
c1 c2 c2.girar(70)
_rut = “rut1“ print(c2.saldo)
_saldo = 90
_numTrans = 2
c3 = c2
_rut = “rut2“ print(c3.saldo)
_saldo = 50
_numTrans = 2
c3.depositar(50)
c3 print(c2.saldo)

IN1010 – enrique.urra@uaysen.cl 30
Manejo de estados y referencias

from cuenta import CuentaCorriente

c1 = CuentaCorriente('rut1')
¿Qué imprime por pantalla? c1.depositar(100)
c1.girar(10)
print(c1.saldo)

Memoria del computador c2 = CuentaCorriente('rut2')
c2.depositar(50)
c1 c2 c2.girar(70)
_rut = “rut1“ print(c2.saldo)
_saldo = 90
_numTrans = 2
c3 = c2
_rut = “rut2“ print(c3.saldo)
_saldo = 100
_numTrans = 3 c3.depositar(50)
c3 print(c2.saldo) # 100

IN1010 – enrique.urra@uaysen.cl 31
Manejo de estados y referencias

from cuenta import CuentaCorriente

c1 = CuentaCorriente('rut1')
¿Qué imprime por pantalla? c1.depositar(100)
c1.girar(10)
print(c1.saldo)

Memoria del computador c2 = CuentaCorriente('rut2')
c2.depositar(50)
c1 c2 c2.girar(70)
_rut = “rut1“ print(c2.saldo)
_saldo = 90
_numTrans = 2
c3 = c2
_rut = “rut2“ print(c3.saldo)
_saldo = 100
_numTrans = 3
c3.depositar(50)
c3 print(c2.saldo)

c1 = None
print(c1.saldo)

IN1010 – enrique.urra@uaysen.cl 32
Manejo de estados y referencias

from cuenta import CuentaCorriente

c1 = CuentaCorriente('rut1')
¿Qué imprime por pantalla? c1.depositar(100)
c1.girar(10)
print(c1.saldo)

Memoria del computador c2 = CuentaCorriente('rut2')
c2.depositar(50)
c1 c2 c2.girar(70)
print(c2.saldo)
None
c3 = c2
_rut = “rut2“ print(c3.saldo)
_saldo = 100
_numTrans = 3
c3.depositar(50)
c3 print(c2.saldo)

c1 = None
print(c1.saldo) Error!!
IN1010 – enrique.urra@uaysen.cl 33
Manejo de estados y referencias

Puede hacer el mismo ejercicio para un arreglo
de objetos de tipo CuentaCorriente

IN1010 – enrique.urra@uaysen.cl 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 – enrique.urra@uaysen.cl 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 – enrique.urra@uaysen.cl 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 – enrique.urra@uaysen.cl 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 – enrique.urra@uaysen.cl 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 – enrique.urra@uaysen.cl 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 – enrique.urra@uaysen.cl 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 – enrique.urra@uaysen.cl 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 – enrique.urra@uaysen.cl

IN1010 – enrique.urra@uaysen.cl