Curso Python. Volumen X: Programación Orientada a Objetos
Bienvenidos un día más al curso de Python, hoy os voy a introducir al paradigma de programación Orientada a Objetos. Este paradigma de programación hace que cambiemos de mentalidad a la hora de programar, ya que damos más importancia a los datos. Pongámonos manos a la obra.
Seguiré la filosofía de enseñaros este nuevo paradigma a través de un ejemplo, como ya hicimos en los primeros capítulos. He desarrollado el mismo ejemplo que ya tenemos para que sea más fácil. En este tipo de programación tendremos que aprender a manejar los objetos. Los objetos son instancias de las clases. Podríamos decir, que un objeto es ahora nuestra variable y su tipo será el de la clase que pertenezca.
Una clase sería un tipo especial de dato. Dentro de la clase encontraremos atributos y métodos.
Los atributos serían las variables, y los métodos las funciones. Para que me entendáis mejor os pongo un ejemplo:
class Cuenta(object):
def __init__(self,numeroCuenta,cantidad):
self.__numCuenta=numeroCuenta
self.__saldo = cantidad
def sacarDinero(self, cantidad):
self.__saldo -= cantidad
def ingresarDinero(self, cantidad):
self.__saldo += cantidad
def getSaldo(self):
return self.__saldo
def getNumeroCuenta(self):
return self.__numCuenta
Esta sería nuestra clase cuenta, tiene dos atributos numCuenta y saldo, que son dos variables, y los métodos son: sacarDinero, ingresarDinero, getSaldo, getNumeroCuenta. Con estos métodos que serían nuestras funciones, manejamos los valores de nuestros atributos (variables).
El método init, es el constructor de la clase. Todas las clases tienen que tener un constructor, este puede ser vacío, y se le pueden pasar o no parámetros. En nuestro caso le pasamos dos parámetros numeroCuenta y cantidad, y los aprovechamos para inicializar las variables. Es verdad que notaréis un poco de diferencia con otros lenguajes de programación pero en esencia es lo mismo, solo que lo escriben de otro modo.
Esto sería una clase, una buena práctica es crear un fichero por clase. Ya que será más fácil después el depurar y el realizar mejoras a las clases. En mi caso el fichero de la clase Cuenta se llama cuenta.py
Pero os estaréis preguntando, donde está el resto del programa porque ahí solo está una parte de la aplicación que hicimos. Porque está bien tener cuentas, pero necesitamos tener personas que tengan cuentas. Así que hemos creado otra clase llamada persona. Este sería su código:
from cuenta import Cuenta
class Persona(object):
def __init__(self,nombre,apellido,cantidad,numCuenta):
self.__nombre = nombre
self.__apellido = apellido
self.__cuenta = Cuenta(numCuenta,cantidad)
def setNombre(self, nombre):
self.__nombre = nombre
def getNombre(self):
return self.__nombre
def setApellido(self, apellido):
self.__apellido = apellido
def getApellido(self):
return self.__apellido
def hacerIngreso(self, cantidad):
self.__cuenta.ingresarDinero(cantidad)
def retirarDinero(self, cantidad):
self.__cuenta.sacarDinero(cantidad)
def getSaldo(self):
return self.__cuenta.getSaldo()
def getNumeroCuenta(self):
return self.__cuenta.getNumeroCuenta()
Esta clase empieza con un “from cuenta import Cuenta“. Esto quiere decir que del fichero “cuenta” queremos incluir la clase “Cuenta”. Esto es porque si os habéis fijado, uno de los atributos de esta clase es cuenta y es un objeto del tipo “Cuenta”. Es decir esta clase tiene una instancia de la clase Cuenta. El resto de la clase como veis es muy parecida a la anterior, ya que vuelve a tener métodos para exponer los atributos y así obligar a usar mis métodos en vez de acceder directamente a ellos.
Nuestro programa principal será main.py como hemos estado haciendo hasta ahora. Su código será el siguiente:
from persona import Persona
import os
numCuentas = 2
clientes = []
opcion = 0
persona0 = Persona('Javier', 'Ceballos', 0.0, 0)
persona1 = Persona('Maria', 'Gutierrez', 0.0, 1)
clientes.append(persona0)
clientes.append(persona1)
while ('6' != opcion):
opcion = input('''Por favor seleccione una operacion:
1 Ver cuentas
2 Crear cuenta
3 Ver saldo
4 Hacer ingreso
5 Hacer retirada
6 Exit
''')
if opcion == '1':
for cliente in clientes:
print('Nombre: ' + cliente.getNombre())
print('Apellido: ' + cliente.getApellido())
print('Numero de Cuenta: ' + str(cliente.getNumeroCuenta()))
print('\n')
input("Pulse Enter para continuar...")
elif opcion == '2':
nombre = input('Introduzca nombre: ')
apellido = input('Introduzca apellido: ')
persona = Persona(nombre, apellido, 0.0, numCuentas)
numCuentas += 1
clientes.append(persona)
print("Cuenta creada")
input("Pulse Enter para continuar...")
os.system('cls')
elif opcion == '3':
cuenta = input('Por favor indique el numero de cuenta:')
print('El saldo de la cuenta ' +cuenta+' es de: '+str(clientes[int(cuenta)].getSaldo())+' Euros')
input("Pulse Enter para continuar...")
os.system('cls')
elif opcion == '4':
cuenta = input('Por favor indique el numero de cuenta al que desea hacer el ingreso:')
cantidad = input('Por favor indique la cantidad a ingresar:')
clientes[int(cuenta)].hacerIngreso(int(cantidad))
print('Se ha realizado el ingreso')
input("Pulse Enter para continuar...")
os.system('cls')
elif opcion == '5':
cuenta = input('Por favor indique el numero de cuenta al que desea hacer el ingreso:')
cantidad = input('Por favor indique la cantidad a retirar:')
clientes[int(cuenta)].retirarDinero(int(cantidad))
print('Se ha realizado la retirada')
input("Pulse Enter para continuar...")
os.system('cls')
print('Fin del programa')
Como podéis comprobar vuelvo a poner una sentencia “from” para importar la clase persona, no lo hago de la clase “cuenta” debido a que la clase “persona” ya la tiene incluida. El programa de inicio es muy parecido al de nuestro primer programa solo que mucho más limpio, ya que ahora con la clase “persona” ya tenemos todo el control de las cuentas, y podemos simular mejor un banco ya que como comprobaréis, hay definida una lista de clientes que son de tipo persona. Tal y como sería en la realidad.
Y esto es todo por hoy, como veis la programación orientada a objetos es más fácil de lo que suena. Os invito a que intentéis mejorar la aplicación, por ejemplo se me ocurre que haya una opción de añadir cuenta, o poder grabar los datos en disco como hemos hecho en otros capítulos.En la próxima entrega os daré la solución a esta propuesta y os contaré más cosas de este tipo de paradigma programación.
Via: www.redeszone.net