"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo se puede imitar el comportamiento de una clase en los módulos de Python?

¿Cómo se puede imitar el comportamiento de una clase en los módulos de Python?

Publicado el 2024-11-16
Navegar:248

How Can You Mimic Class-Like Behavior in Python Modules?

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:

  • Python solo comprueba dichos métodos en las clases.
  • Modificar el tipo de módulo subyacente (módulo) para permitir la configuración de atributos no es factible.

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__.

Último tutorial Más>

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