Maison > développement back-end > Tutoriel Python > Comment pouvez-vous implémenter un comportement de type « getattr » pour les modules en Python ?

Comment pouvez-vous implémenter un comportement de type « getattr » pour les modules en Python ?

Mary-Kate Olsen
Libérer: 2024-10-29 14:57:02
original
760 Les gens l'ont consulté

How Can You Implement `getattr`-like Behavior for Modules in Python?

getattr Implémentation dans les modules

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 :

  1. xxx les méthodes ne sont invoquées que sur la classe elle-même, ce qui rend difficile la mise en œuvre de la substitution d'attributs pour l'ensemble du module.
  2. Les modules ne sont pas mutables, ce qui interdit l'attribution directe de nouveaux attributs à l'aide de __setattr__.

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!

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal