Implémentation dynamique d'un comportement de type classe dans les modules à l'aide de getattr
Dans certains scénarios, il peut être souhaitable d'imiter le comportement de __getattr__ sur une classe mais pour un module entier. Cela permet la création dynamique d'instances de classe et l'invocation de leurs méthodes en fonction de recherches d'attributs sur le module.
Cependant, tenter de définir une méthode __getattr__ directement sur un module se heurte à deux obstacles :
Solution basée sur le wrapper
Une approche consiste à créer un wrapper autour du module. Sys.modules tolère différents types d'objets, nous pouvons donc envelopper le module dans une classe et l'attribuer à sys.modules[__name__]. Cela permet un comportement dynamique sans modifier le module lui-même. Cette technique, cependant, ne s'applique qu'à l'accès au niveau du module.
Le hack de Guido van Rossum
Une autre solution suggérée par Guido van Rossum consiste à remplacer le module réel dans sys. modules avec une instance d’une classe définie dans le module. La machinerie d’importation effectue cette dernière étape de substitution, permettant ce hack. L'exemple suivant illustre cette approche :
# module foo.py
import sys
class Foo:
def funct1(self, *args):
def funct2(self, *args):
sys.modules[__name__] = Foo()
Désormais, les fonctions définies dans le module sont accessibles via l'instance de Foo.
Considérations
Lors de l'utilisation de ces techniques, d'autres éléments du module peuvent être inaccessibles après l'affectation de sys.modules. Définissez toutes les fonctionnalités nécessaires dans la classe de remplacement pour éviter de perdre le contenu du module.
__all__ Attribute
Lors de l'utilisation à partir de l'importation de module *, définissez __all__ dans la classe de remplacement pour gérer cela. type de déclaration d'importation. Omettez les attributs tels que __module__ et __qualname__ de __all__.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3