10. Clases y Objetos¶
Existen distintos paradigmas (modelos) de programación:
- Programación orientada a procedimientos:
- Se enfoca en escribir funciones o procedimientos que operan sobre datos.
- Programación orientada a objetos:
- Se enfocan en la creación de objetos que contienen ambas cosas, datos y funciones.
Nota
Una clase define un nuevo tipo de dato.
class NombreClase:
<sentencia 1>
<sentencia 2>
...
<sentencia n>
Ejemplo:
La siguiente clase define un nuevo tipo de dato, el tipo Curso
1 2 | class Curso:
pass
|
Las variables de una clase type
son llamadas instancias u objetos.
from tipos import Curso
if __name__ == '__main__':
c1 = Curso()
c2 = Curso()
print('De que tipo es c1? ', type(c1))
print('c1 es una Cadena? ', isinstance(c1, str))
print('c1 es un Curso? ', isinstance(c1, Curso))
(user)$ python ejemplo.py
Que de que tipo es c1? <class 'tipos.Curso'>
c1 es una Cadena? False
c1 es un Curso? True
Las funciones definidas dentro de una clase tienen un nombre especial, se llaman métodos.
Toda clase tiene un método de inicialización (__init__()
) que se ejecuta justo después que una variable de la clase type
es declarada.
class Curso:
def __init__(self):
pass
El método __init__()
recibe un parámetro llamado self. Todo método debe tener al menos un parámetro y debe llamarse self. Este parámetro es una referencia al objeto en el cual se esta llamando el método.
1 2 3 4 5 6 7 8 9 10 | class Curso:
def __init__(self, titulo):
self.titulo = titulo
self.grupo = 0
self.lugares = 0
self.alumnos = []
self.profesor = ''
self.ayudante = ''
self.carreras = []
|
class Curso:
def __init__(self, titulo):
self.titulo = titulo
self.grupo = 0
self.lugares = 0
self.alumnos = []
self.profesor = ''
self.ayudante = ''
self.carreras = []
def asigna_cupo(self, n):
"""
Asigna el número de estudiantes que pueden estar inscritos en el grupo.
Si el número es menor al número de estudiantes inscritos regresa False
:param n: número de estudiantes
:return: True o False
"""
if n >= len(self.alumnos):
self.lugares = n
return True
return False
def asigna_profesor(self, profesor):
"""
Asigna el nombre del profesor al curso
:param profesor: nombre del profesor
:return:
"""
self.profesor = profesor
def asigna_ayudante(self, ayudante):
"""
Asigna el ayudante del curso
:param ayudante: nombre del ayudante
:return:
"""
self.ayudante = ayudante
def estainscrito(self, ncuenta):
"""
Revisa si el número de cuenta esta inscrito en el curso.
Si esta inscrito regresa True, si no regresa False.
:param ncuenta: número de cuenta
:return: True or False
"""
return ncuenta in self.alumnos
def lugaresdisponibles(self):
"""
Regresa el número de lugares disponibles
:return: número de lugares disponibles
"""
return self.lugares - len(self.alumnos)
def agrega_alumno(self, ncuenta):
"""Agrega al alumno con número de cuenta ncuenta al curso
:param ncuenta: número de cuenta
:return:
"""
if not self.estainscrito(ncuenta):
self.alumnos.append(ncuenta)
def borraalumno(self, ncuenta):
"""
Borra alumno del curso
:param ncuenta:
:return:
"""
if not self.estainscrito(ncuenta):
raise ValueError('No esta inscrito')
self.alumnos.remove(ncuenta)
def numeroalumnos(self):
"""
Regresa el numúmero de alumnos inscritos
:return: numúmero de alumnos inscritos
"""
return len(self.alumnos)
def lista_de_alumnos(self):
"""
Regresa la lista de alumnos.
:return: Una lista de números de cuenta
"""
return self.alumnos
def profesor(self):
"""
regresa el nombre del profesor
:return: nombre del profesor
"""
return self.profesor
from curso import Curso
if __name__ == '__main__':
curso_programacion = Curso('Programación')
curso_programacion.asigna_cupo(50)
curso_programacion.agrega_alumno('1234')
try:
curso_programacion.borraalumno('134')
except ValueError as e:
print(e)
curso_programacion.lugaresdisponibles()
curso_programacion.estainscrito('1234')
curso_manejodatos = Curso('Calculo')
print('Lugare: ', curso_programacion.lugaresdisponibles())
10.1. Ejemplos¶
10.1.1. openpyxl¶
openpyxl es un modulo para leer y escribir archivos en formato excel (xlsx/xlsm)
Este módulo representa mediante orientacíon a objetos un libro de excel
Para intalar un módulo en PyCharm ir a Pycharm -> Preferencias Proyect: code -> Project Interpreter -> +

Escribimos openpyxl y seleccionamos instalar

from openpyxl import load_workbook
if __name__ == '__main__':
wb = load_workbook('wos.xlsx', read_only=True)
ws = wb.active
for row in ws.rows:
for cell in row:
print(cell.value)
from openpyxl import Workbook
if __name__ == '__main__':
wb = Workbook()
ws = wb.active
ws.title = 'Clasificacion'
ws['A1'] = 4
ws['B1'] = 5
d = ws.cell(row=4, column=2, value=10)
wb.save('prueba.xlsx')
from openpyxl import Workbook
if __name__ == '__main__':
wb = Workbook(write_only=True)
ws = wb.create_sheet()
ws2 = wb.create_sheet()
for irow in range(100):
ws.append(['%d' % i for i in range(200)])
ws2.append(['%d' % (i + 1) for i in range(200)])
wb.save('new_big_file.xlsx')
10.1.2. matplotlib¶
import random
class Histograma:
def __init__(self, n):
self._freq = [0 for i in range(n)]
def agregaPunto(self, i):
self._freq[i] += 1
def frecuencia(self, i):
return self._freq[i]
def longitud(self):
return len(self._freq)
def __str__(self):
cadenas = ['%s -> %s' % (i, j) for i, j in enumerate(self._freq)]
return ', '.join(cadenas)
if __name__ == '__main__':
h = Histograma(10)
for i in range(h.longitud()):
for j in range(random.randint(0, 50)):
h.agregaPunto(i)
print(h)
from histograma import Histograma
import matplotlib.pyplot as plt
import random
h = Histograma(10)
for i in range(h.longitud()):
for j in range(random.randint(0, 50)):
h.agregaPunto(i)
print(h)
x = range(h.longitud())
frecuencias = [h.frecuencia(i) for i in x]
plt.bar(x, frecuencias)
plt.show()
