Maison >développement back-end >Tutoriel Python >Comment pouvez-vous imiter un comportement de classe dans les modules Python ?

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

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-29 19:04:02887parcourir

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.
  • Modifier le type de module sous-jacent (module) pour autoriser la définition d'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 lui-même 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 :

<code class="python"># module foo.py

import sys

class Foo:
    def funct1(self, *args):
        <code block>
    def funct2(self, *args):
        <code block>

sys.modules[__name__] = Foo()</code>

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 au sein de la classe de remplacement pour éviter de perdre le contenu du module.

__all__ Attribute

Lors de l'utilisation de from module import *, définissez __all__ dans la classe de remplacement pour gérer cela type de déclaration d'importation. Omettez les attributs comme __module__ et __qualname__ de __all__.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn