Вы находитесь на странице: 1из 4

Tecnologas de Sistemas de Informacin

Grado de Ingeniera Informtica en Sistemas de Informacin - Curso 2014/2015


Enseanzas Prcticas y de Desarrollo

EPD 2: Python (II)


Notas: La realizacin de los experimentos y los ejercicios tendr lugar durante la sesin presencial de prcticas,
mientras que los problemas se desarrollarn como trabajo no presencial. Preste atencin cuando copie y pegue cdigo
desde este boletn al entorno de programacin, pues pueden aparecer artefactos que introduzcan errores.
Objetivos

Aprender la programacin orientada a objetos con Python.


Manejar las listas, tuplas y diccionarios mediante sus mtodos.
Utilizar y crear paquetes y mdulos en Python.

Conceptos
1. Programacin orientada a objetos en Python
Mediante la programacin orientada a objetos en Python es posible crear clases y objetos, adems de utilizar las
extensas libreras de clases y objetos existentes. Los atributos de una clase en Python existen a partir del momento en el
que se les asigna un primer valor.
Los mtodos se definen dentro de una clase del mismo modo que se definen las funciones en Python. Los mtodos
deben recibir un primer argumento que es self y hace referencia al objeto que invoca al mtodo. Los mtodos o atributos
privados se indican precediendo los caracteres __. Los mtodos especiales en Python se preceden y suceden su nombre
por los caracteres __. Puede encontrarse una lista de los mtodos especiales disponibles en Python en [1].
En Python se permite la herencia clsica entre clases y la herencia mltiple. A partir de la versin 2.2 de Python es
posible crear clases de nuevo estilo, y stas tienen, entre otras, la ventaja de incorporar propiedades, que facilitan el
encapsulamiento.
En Python todo son objetos, tanto las instancias de las clases, como los int, long, float, bool, str, list, tuple, dict, y
tambin las funciones (function) y mdulos y paquetes (module). Y los literales tambin son objetos, no slo las
variables. Por ejemplo, se pueden extraer las palabras de esta frase as: "son dos palabras".split(" ").
2. Paquetes y mdulos en Python
En Python los programas pueden ser divididos en unidades llamadas mdulos, y stos pueden agruparse en
contenedores llamados paquetes. A nivel fsico, los mdulos son ficheros de texto con cdigo en Python (extensin .py).
Los paquetes son directorios que contienen ficheros (mdulos) y un fichero especial que debe llamarse __init__.py, el
cual puede estar vaco o incluir definiciones de inters para el paquete. Puede encontrarse una lista de paquetes y
mdulos disponibles para Python en [2].
Bibliografa Bsica
1.
2.
3.
4.

Mtodos especiales en Python: https://docs.python.org/2/reference/datamodel.html#special-method-names


Librera de Paquetes y mdulos disponibles para Python: https://wiki.python.org/moin/UsefulModules
Artculo de programacin orientada a objetos Python: http://www.maestrosdelweb.com/editorial/guia-python
Libro Python para Todos: http://mundogeek.net/tutorial-python/

Tecnologas de Sistemas de Informacin

EPD 2: Python (II)

Experimentos
E1. (15 min.) Estudiar el siguiente cdigo fuente Python (adaptado desde [3]). Discuta y comprenda cul es el propsito
de cada parte de dicho cdigo.
# -*- coding: utf-8 -*print "Modelos de presupuestos"
class ModeloDePresupuesto:
# Datos comerciales
titulo = "PRESUPUESTO"
encabezado_nombre = "Eugenia Bahit"
encabezado_web = "www.eugeniabahit.com.ar"
encabezado_email = "mail@mail.com"
# Datos impositivos
alicuota_iva = 21
# Propiedades relativas al formato
divline = "="*80
# Setear los datos del cliente
def set_cliente(self):
self.empresa = raw_input('\tEmpresa: ')
self.cliente = raw_input('\tNombre del cliente: ')
# Setear los datos basicos del presupuesto
def set_datos_basicos(self):
self.fecha = raw_input('\tFecha: ')
self.servicio = raw_input('\tDescripcion del servicio: ')
importe = raw_input('\tImporte bruto: $')
self.importe = float(importe)
self.vencimiento = raw_input('\tFecha de caducidad: ')
# Calcular IVA
def calcular_iva(self):
self.monto_iva = self.importe*self.alicuota_iva/100
# Calcula el monto total del presupuesto
def calcular_neto(self):
self.neto = self.importe+self.monto_iva
# Armar el presupuesto
def armar_presupuesto(self):
"""Esta funcion se encarga de armar todo el presupuesto"""
txt = '\n'+self.divline+'\n'
txt += '\t'+self.encabezado_nombre+'\n'
txt += '\tWeb Site: '+self.encabezado_web+' | '
txt += 'E-mail: '+self.encabezado_email+'\n'
txt += self.divline+'\n'
txt += '\t'+self.titulo+'\n'
txt += self.divline+'\n\n'
txt += '\tFecha: '+self.fecha+'\n'
txt += '\tEmpresa: '+self.empresa+'\n'
txt += '\tCliente: '+self.cliente+'\n'
txt += self.divline+'\n\n'
txt += '\tDetalle del servicio:\n'
txt += '\t'+self.servicio+'\n\n'
txt += '\tImporte: $%0.2f | IVA: $%0.2f\n' % (self.importe, self.monto_iva)
txt += '-'*80
txt += '\n\tMONTO TOTAL: $%0.2f\n' % (self.neto)
txt += self.divline+'\n'
print txt
# Metodo constructor
def __init__(self):
print self.divline
print "\tGENERACION DEL PRESUPUESTO"
print self.divline
self.set_cliente()
self.set_datos_basicos()
self.calcular_iva()
self.calcular_neto()
self.armar_presupuesto()

E2. (20 min.) Almacene la clase definida en el anterior experimento en un mdulo llamado presupuestos dentro de un
paquete llamado ventas. Cree un mdulo aparte del paquete ventas llamado pruebas_presupuestos dentro de un paquete
pruebas en el que debe crear un objeto de esta clase y realizar todos los pasos necesarios para crear un presupuesto.
Modifique el mdulo presupuestos para que no muestre el mensaje Modelos de presupuestos cuando es importado.
Tecnologas de Sistemas de Informacin

EPD 2: Python (II)

Ejercicios
EJ1. (20 min.) Mejore la clase ModeloDePresupuesto del experimento 1 incorporndole encapsulamiento. Aplquelo
utilizando propiedades. Es robusto y fiable el encapsulamiento que incorpora Python?
EJ2. (20 min.) Cree un nuevo mdulo llamado ventas dentro del paquete ventas. Agregue una funcin llamada prueba
en este mdulo ventas que imprima por pantalla Prueba desde el mdulo de ventas. A continuacin, aada una
funcin con el mismo nombre, prueba, en el mdulo de presupuestos (creado en el experimento 2), que escriba Prueba
desde el mdulo de presupuestos.
En el mdulo pruebas_presupuestos, importe los mdulos ventas y presupuestos e invoque a la funcin prueba.
Pronostique qu saldr por pantalla antes de ejecutar el programa. Comprubelo.
Haga los cambios necesarios para que en el mdulo pruebas_presupuestos, se puedan utilizar tanto la funcin prueba
de presupuestos como la de ventas, adems de poder utilizar la funcin prueba con un comportamiento predeterminado.
EJ3. (15 min.) Aada el mtodo especial __str__ a la clase ModeloDePresupuesto de manera que la confeccin del
presupuesto no se escriba por pantalla sino que se devuelva como cadena de caracteres. Utilice la nueva forma de crear
el presupuesto desde el mdulo pruebas_presupuestos.
EJ4. (25 min.) Aada a la clase ModeloDePresupuesto la posibilidad de comparar presupuestos representados como
objetos de dicha clase. El criterio de comparacin entre presupuestos ser por el importe neto. Cree tres presupuestos en
el mdulo pruebas_presupuestos, agrguelos a una lista y ordene la lista. Compruebe los resultados obtenidos.

Problemas
P1. (35 mins) Cree un sistema para gestionar notas de los alumnos para una determinada asignatura. Desde un men
principal se podr establecer la nota para un alumno o se podr consultar. Las notas se almacenarn en memoria como
un diccionario en que el nombre del alumno hace de clave y la nota asociada hace de valor. Cuando se establezca la
nota, se comprobar previamente si el alumno ya tena una, y en caso afirmativo se pedir confirmacin al usuario de
que desea sobrescribirla. En lo que se refiere a la consulta de la nota, se comprobar que el usuario est registrado ya en
el sistema y en caso contrario se mostrar un mensaje de error. Para ello, use los mtodos de los diccionarios vistos en
la clase de teora.
P2. (50 mins.) Mejore la clase ModeloDePresupuesto para que soporte mltiples servicios presupuestados, en lugar de
considerar uno slo como se hace en dicha clase. De esta forma, en el presupuesto debe calcularse la suma de los
importes de cada servicio. Para ello, cree un nuevo mdulo en el paquete ventas denominado presupuestosMultiples. En
dicho mdulo defina una clase ModeloDePresupuestoMultiple que herede de la clase ModeloDePresupuesto del mdulo
presupuestos. Para soportar mltiples servicios en un presupuesto, puede emplear las listas de Python. Aada mtodos
para aadir servicios al presupuesto, para eliminar servicios, para modificarlos y para consultarlos.
P3. (45 mins) Cree un pequeo sistema de autocorrecin ortogrfica en Python. El sistema tendr un pequeo
diccionario en que se tendr una coleccin de palabras escritas errneamente, junto con la forma correcta de escribir las
mismas. Emplee un diccionario para mantener esta coleccin. El sistema recibir un texto de entrada e imprimir el
texto corregido. Para ello, se aplicar el siguiente mtodo. ste consiste en separar el texto de entrada en palabras
(separe la cadena por espacios) y busca cada palabra en el diccionario para conocer si existe una correccin para la
misma. Tenga en cuenta que en ese caso, para hacer la bsqueda, tendr que eliminar todos los signos de puntuacin de
las palabras extradas del texto (sustituya stos por la cadena vaca para eliminarlos y mantenga una lista de signos de
puntuacin para facilitar la operativa). Si se encuentra la correccin en el diccionario, la palabra errnea deber ser
substituida por su versin escrita correctamente. Terminadas todas las correcciones, se imprimir por pantalla el texto
enmendado.
P4. (50 mins.) Realizar una versin orientada a objetos del programa del problema P2 de la EPD-1. Comente las
decisiones principales que ha tenido que tomar al realizar este cambio de paradigma. Pruebe la nueva versin del
programa.

Tecnologas de Sistemas de Informacin

EPD 2: Python (II)

Datos de la Prctica:
Autor del documento: Gualberto Asencio Corts (Octubre 2014).
Estimacin temporal:
Parte presencial: 120 minutos.
o Explicacin inicial: 5 minutos.
o Experimentos: 35 minutos.
o Ejercicios: 80 minutos.
Parte no presencial: 180 minutos.
o Problemas: 180 minutos

Tecnologas de Sistemas de Informacin