Espacios de nombre y clases

Estoy tratando de escribir algún código legible (en mi opinión) en Python. Necesito un módulo que contendrá una serie de clases. Teóricamente, conozco todo lo que se necesita para lograr esto: simplemente puedo poner las definiciones de clase en un solo archivo de módulo.

Para facilitar la lectura, quiero poner cada definición de clase en un archivo separado (¡están empezando a ser bastante largos!), Y todas estas clases en un directorio. Cada vez que creo un archivo nuevo, aunque sus contenidos son visibles donde los necesito, la definición de la clase que se encuentra dentro está dentro del scope de un módulo innecesario.

¿Cómo debería hacerlo? ¿Cuál es la manera ‘Python’ de hacer eso?

__init__.py todas dentro de __init__.py , y luego __init__.py que el consumidor importe el paquete.

 from .module1 import Class1 from .module2 import Class2 ... 

Si desea evitar los nombres completos de rutas de acceso, archivos, clases y funciones en muchos lugares, puede hacer algo como lo siguiente, que importa (casi) todos los archivos de Python que se encuentran en el subdirectorio de un paquete.

La clave es recordar que el archivo __init__.py es un script de Python en gran medida sin restricciones, y por lo tanto es libre de realizar un procesamiento propio bastante sofisticado para determinar qué hay en el espacio de nombres del paquete.

package\__init__.py archivos package\__init__.py :

 def _import_package_files(): """ Dynamically import all the Python modules in this module's sub directory. """ import os import sys import traceback package_path = os.path.split(__file__)[0] package_directory = os.path.split(package_path)[1] for fn in os.listdir(package_directory): globals_, locals_ = globals(), locals() # process all python files in directory that don't start with underscore if fn[0] != '_' and fn.split('.')[-1] in ('py', 'pyw'): modulename = fn.split('.')[0] # filename without extension subpackage = ".".join([package_directory, modulename]) try: module = __import__(subpackage, globals_, locals_, [modulename]) except: traceback.print_exc(file=sys.stdout) raise # reraise exception _import_package_files() 

package\Class1.py archivo package\Class1.py :

 class Class1(object): pass 

package\Class2.py archivo package\Class2.py :

 class Class2(object): pass 

package\Class3.py archivo package\Class3.py :

 class Class3(object): pass 

Archivo usepackage.py :

 import package print(package.Class1) print(package.Class2) print(package.Class3) 

Salida de ejecutar usepackage.py :