Maison > développement back-end > Tutoriel Python > Comment implémenter la fonctionnalité getattr pour les modules en Python ?

Comment implémenter la fonctionnalité getattr pour les modules en Python ?

DDD
Libérer: 2024-10-29 20:48:03
original
383 Les gens l'ont consulté

How to Implement getattr Functionality for Modules in Python?

Comment implémenter getattr sur un module

En Python, les objets peuvent avoir des attributs dynamiques qui ne sont pas définis dans leur définition de classe. Ce comportement dynamique est obtenu grâce à la méthode getattr, qui est appelée lorsqu'une recherche d'attribut échoue sur un objet. Malheureusement, les modules ne prennent pas automatiquement en charge __getattr__.

L'objectif est d'imiter la fonctionnalité getattr sur un module de telle sorte que lorsqu'un attribut n'est pas trouvé, une instance d'une classe prédéfinie est créée avec le même nom et la méthode portant ce nom est invoquée sur cette instance.

Tentative d'implémentation et défis

Une tentative a été faite pour implémenter getattr sur un module comme suit :

<code class="python">class A(object):
    def salutation(self, accusative):
        print "hello", accusative

# intentionally on the module, not the class
def __getattr__(mod, name):
    return getattr(A(), name)

if __name__ == "__main__":
    salutation("world")  # hoping for __getattr__ to be invoked</code>
Copier après la connexion

Cependant, cette approche se heurte à deux obstacles :

  1. xxx les méthodes sont exclusivement recherchées sur la classe.
  2. TypeError : can 'ne définit pas les attributs du type intégré/d'extension 'module'

Solutions possibles

Méthode Wrapper :

Les sys.modules Le dictionnaire est flexible et permet la création d'un wrapper qui intercepte l'accès au module. Cependant, cela ne prend en charge que l'accès aux méthodes via le module, et non à l'intérieur du module lui-même. De plus, créer une nouvelle instance à chaque fois peut conduire à un comportement différent par rapport à l'approche globale.

Remplacement de classe :

Comme recommandé par Guido van Rossum, une approche hackish implique de créer une classe et de remplacer sys.modules[__name__] par une instance de cette classe. Cela permet d'utiliser __getattr__/__setattr__/__getattribute__. Cependant, il comporte des mises en garde :

  • Tous les autres attributs du module seront perdus après le remplacement.
  • Pour l'importation du module *, tous doit être défini dans la classe pour prendre en charge les importations génériques.

Conclusion

Bien que les modules Python ne prennent pas en charge nativement __getattr__, les solutions suggérées fournissent des solutions de contournement pour obtenir une résolution d'attribut dynamique similaire pour les modules.

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal