"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment pouvez-vous imiter un comportement de classe dans les modules Python ?

Comment pouvez-vous imiter un comportement de classe dans les modules Python ?

Publié le 2024-11-16
Parcourir:969

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

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 :

  • Python vérifie uniquement ces méthodes sur les classes.
  • La modification du type de module sous-jacent (module) pour autoriser la définition des attributs n'est pas réalisable.

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

Dernier tutoriel Plus>

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