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

tipos.py
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.

curso.py
 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 = []
curso.py
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
ejemplo02.py
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 -> +

openpyxl

Escribimos openpyxl y seleccionamos instalar

openpyxl
lectura de archivos excel
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)
escritura de archivos excel
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')


Escritura
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

matplotlib

histograma.py
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)
plot
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()
Histograma