Implementar dinámicamente un comportamiento similar a una clase en módulos usando getattr
En algunos escenarios, puede ser deseable imitar el comportamiento de __getattr__ en una clase sino para un módulo completo. Esto permite la creación dinámica de instancias de clase y la invocación de sus métodos basándose en búsquedas de atributos en el módulo.
Sin embargo, intentar definir un método __getattr__ directamente en un módulo enfrenta dos obstáculos:
Solución basada en contenedor
Un enfoque es crear un contenedor alrededor del módulo. Sys.modules tolera diferentes tipos de objetos, por lo que podemos envolver el módulo dentro de una clase y asignarlo a sys.modules[__name__]. Esto permite un comportamiento dinámico sin modificar el módulo en sí. Esta técnica, sin embargo, se aplica sólo al acceso a nivel de módulo.
Hack de Guido van Rossum
Otra solución sugerida por Guido van Rossum implica reemplazar el módulo real en sys. módulos con una instancia de una clase definida dentro del módulo. La maquinaria de importación realiza este paso final de sustitución, lo que permite este truco. El siguiente ejemplo demuestra este enfoque:
# module foo.py
import sys
class Foo:
def funct1(self, *args):
def funct2(self, *args):
sys.modules[__name__] = Foo()
Ahora, se puede acceder a las funciones definidas en el módulo a través de la instancia de Foo.
Consideraciones
Al utilizar estas técnicas, es posible que otros elementos del módulo sean inaccesibles después de la asignación sys.modules. Defina toda la funcionalidad necesaria dentro de la clase de reemplazo para evitar perder el contenido del módulo.
__all__ Atributo
Cuando use from module import *, defina __all__ en la clase de reemplazo para manejar esto tipo de declaración de importación. Omita atributos como __module__ y __qualname__ de __all__.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3