Modularización II (con el uso de POO)


Organización y uso de clases en un sistema de módulos

En Python, al utilizar el sistema de archivos y módulos, busca por defecto los archivos .py dentro de la misma carpeta donde esta el archivo que contiene el código que lo llama. En caso que el archivo .py que contenga los módulos que se desean importar se encontrara en otro directorio diferente al del archivo que contiene el script que lo llama, Python lo busca en SYSPATH, es decir en el conjunto de directorios dentro del cual se encuentra el directorio de instalación de Python. Obviamente no es conveniente guardar los módulos de los sistemas que vayamos desarrollando dentro de los directorios de instalación de Python. Con lo cual se hace necesario, luego de crear el archivo __init__.py dentro de la carpeta que va a funcionar como módulo, incluir el nombre de la carpeta que contiene los archivos .py que componen el módulo. Por ejemplo si incluimos el código de definicion de clases, propiedades y métodos de vehículos vistos anteriormente, en un archivo llamado vehiculos.py que a su vez esté dentro de una carpeta llamada 'modulos' y deseamos importar las funciones y clases en otro script ubicado fuera de la carpeta 'modulos', se hace necesario incluir el nombre de la carpeta 'modulos' usando la nomenclatura del punto (.) y seguido el nombre del archivo (vehiculos.py). Veamos el ejemplo en la práctica:

Contenido del archivo vehiculos.py (Ruta: \modulos\):

class vehiculos():
    def __init__(self,marca,modelo):
        self.marca=marca
        self.modelo=modelo
        self.desplazandose=False
        self.acelerando=False
        self.frenando=False
    def acelera(self):
        self.desplazandose=True
        self.acelerando=True
        self.frenando=False
    def frena(self):
        self.frenando=True
        self.desplazandose=False
        self.acelerando=False
    def estado(self):
        print(f'''
************************ Estado del Vehículo ************************
** Marca:           {self.marca}
** Modelo:          {self.modelo}
** Desplazandose:   {self.desplazandose}
** Acelerando:      {self.acelerando}
** Frenando:        {self.frenando}
*********************************************************************
''')

class automovil(vehiculos):
    puestos=5

class camioneta(vehiculos):
    def cargar(self,cargar):
        self.carga=cargar
        if self.carga:
            print('La camioneta esta cargada')
        else:
            print('La camioneta esta descargada')
       
class moto(vehiculos):
    inclinacion = 'Neutral'
    def inclina(self):
        self.inclinacion='Otra'
    def info(self):
         print('Marca: ', self.marca, 'Modelo: ', self.modelo ,'Inclinación: ', self.inclinacion)

class v_electricos(vehiculos):
    def __init__(self, marca,modelo):
        super().__init__(marca,modelo)
        self.autonomia=100

    def cargar_energia(self):
        self.carga_electrica=True

class moto_electrica(moto,v_electricos):
    def __init__(self, marca, modelo):
        super().__init__(marca, modelo)

class auto_electrico(automovil,v_electricos):
    def __init__(self, marca, modelo):
        super().__init__(marca, modelo)

if __name__=='__main__':
    import os
    os.system('cls')
    print('Este módulo esta pensado solo para ser usado de manera externa . . .')


Es imprtante recordar que dentro de la carpeta 'modulos' debe existir un archivo de texto vacío llamado '__init__.py', para que Python reconozca el contenido de la carpeta 'modulos' como un paquete.

Contenido del archivo principal.py:

from os import system
from modulos.vehiculos import *

system('cls')

moto01=moto_electrica('Ducati','D22')
automovil01=automovil('Ford','Focus')

moto01.estado()
automovil01.estado()

Nótese la inclusión del nombre de la carpeta contenedora de los módulos en la instrucción de importación seguido de punto y el nombre del módulo a importar.

Nota: Python va a crear automáticamente una carpeta llamada '__pycache__' dentro de la carpeta que compone el paquete para que dicha carpeta funcione como tal. También es posible crear subcarpetas dentro de las carpetas de los módulos, los cuales funcionarían como sub paquetes del paquete principal. Pero por supuesto esto va a responder directamente a las necesidades organizativas del programa a desarrollar y del enfoque que le de cada quien, teniendo siempre como premisa principal, la simplicidad, organización, facilidad de uso y reusabilidad del código. Las carpetas que componen los subpaquetes también deben contener el archivo '__init__.py' cada una. Como nota adicional hay que tomar en cuenta que obviamente para llamar a los módulos que se encuentran en los subpaquetes habría que incluir en la instrucción IMPORT, la ruta completa de carpetas donde se encuentra el archivo.py.




Comentarios

Entradas populares