Maison  >  Article  >  développement back-end  >  Comment implémenter l'accès aux attributs dynamiques avec un comportement de type __getattr__ dans les modules ?

Comment implémenter l'accès aux attributs dynamiques avec un comportement de type __getattr__ dans les modules ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-30 06:39:03133parcourir

How to Implement Dynamic Attribute Access with __getattr__-like Behavior in Modules?

Implémentation d'un comportement de type __getattr__ sur un module

Énoncé du problème :

Pour étendre un module avec une fonctionnalité de type __getattr__ qui crée dynamiquement des instances d'un classe et invoque des méthodes sur celles-ci lors de l'accès à des attributs qui n'existent pas dans le module.

Approche : envelopper la fonctionnalité du module

Bien que les méthodes getattr fonctionnent généralement sur les classes, elles n'est pas directement applicable aux modules. Pour résoudre ce problème, une fonction wrapper peut être implémentée pour rediriger l'accès aux attributs vers une instance d'une classe de substitution.

Étape 1 : Implémenter la classe de substitution

<code class="python">class Wrapper:
    def __init__(mod):
        setattr(mod, '__getattr__', getattrmod)</code>

Cette classe wrapper fournit un getattr méthode appelée getattrmod.

Étape 2 : Remplacer le module par le wrapper

<code class="python">sys.modules[__name__] = Wrapper</code>

En remplaçant le module lui-même par le wrapper, tout futur accès aux attributs sur le Le module sera intercepté par la méthode getattr.

Étape 3 : Définir la méthode getattr

<code class="python">def getattrmod(mod, attr):
    # Create an instance of the substitution class
    instance = Class()

    # Invoke the method with the same name as the missing attribute
    return getattr(instance, attr)</code>

Avertissement : mises en garde et limitations

  • Le wrapper remplacera tous les attributs du module, donc toutes les fonctions ou variables existantes seront perdues.
  • Pour prendre en charge l'importation de tous les éléments du module, la classe de substitution doit définir un all attribut.
  • Soyez conscient des implications potentielles en termes de performances si la classe de substitution est instanciée pour chaque accès à l'attribut.

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