Lorsque vous rencontrez un échec de recherche d'attribut dans un module, vous souhaitez créer une instance d'une classe associée avec le module et invoquez une méthode portant le même nom que l'attribut ayant échoué. Cependant, cela n'est pas directement pris en charge dans Python en raison des limitations des méthodes xxx et des restrictions sur la modification des attributs du module.
Les deux défis rencontrés sont :
Solution
Pour surmonter ces limitations, une solution de contournement consiste à créer une instance wrapper d'une classe de substitution et à la stocker dans sys.modules à la place du module d'origine. Cela redirige efficacement toutes les recherches d'attributs vers l'instance wrapper, permettant la mise en œuvre d'un comportement de type getattr__. Cependant, il est important de noter que cette approche peut conduire à un comportement différent par rapport à l'utilisation de __getattr directement sur le module puisque le wrapper crée une nouvelle instance à chaque fois.
Le hack de Guido van Rossum
Guido van Rossum a proposé une approche alternative qui exploite la capacité de la machine d'importation à remplacer les modules dans sys.modules par des instances ou des classes. Dans cette méthode, une classe avec la fonctionnalité souhaitée est définie dans le module et attribuée à sys.modules[__name__] comme acte final du module. Cela permet l'implémentation de getattr et d'autres fonctionnalités de métaprogrammation sur le module lui-même. Cependant, il est important de s'assurer que toutes les fonctionnalités nécessaires sont encapsulées dans la classe de remplacement, car d'autres éléments du module seront perdus lors de l'affectation sys.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!