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.
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>
Cependant, cette approche se heurte à deux obstacles :
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 :
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!