Invocation dynamique de méthodes de classe sur les modules
Lors de l'accès aux attributs d'un module, le comportement typique implique la récupération des attributs définis statiquement. Cependant, que se passe-t-il si nous souhaitons un mécanisme pour créer dynamiquement des instances d'une classe dans le module et invoquer des méthodes de cette classe lors de l'accès aux attributs ?
Pour y parvenir, nous devons surmonter deux obstacles :
- xxx sont spécifiques à la classe et ne sont pas accessibles sur les modules.
Les modules ne peuvent pas se voir attribuer d'attributs dans l'implémentation standard de Python.-
Instance unique Wrapper
Pour contourner les deux limitations, nous utilisons un wrapper qui crée dynamiquement une nouvelle instance de la classe souhaitée à chaque fois qu'une recherche d'attribut échoue :
<code class="python">def __getattr__(mod, name):
return getattr(A(), name)</code>
Copier après la connexion
Dans cette implémentation, 'A' est la classe du module dont nous souhaitons accéder aux méthodes. Cette solution, cependant, peut conduire à de subtiles différences de comportement en raison de la création de plusieurs instances et du contournement des variables globales.
Remplacement par une instance de classe
Alternativement, nous pouvons utiliser la machinerie d'importation de Python pour remplacez le module lui-même par une instance de la classe souhaitée.
<code class="python">class Foo:
def funct1(self, args):
<code>
sys.modules[__name__] = Foo()</code>
Copier après la connexion
Cette technique nous permet effectivement d'utiliser
getattr et d'autres méta-méthodes sur le module.
Notes
Lors de l'utilisation de l'approche wrapper, assurez-vous que tous les éléments nécessaires sont présents dans la classe de remplacement, car toutes les variables globales définies dans le module seront perdues.- Pour 'from module import *' pour fonctionner correctement, assurez-vous que
- tout est défini dans la classe de remplacement.
En comprenant ces techniques, nous pouvons étendre les fonctionnalités des modules pour inclure l'invocation de méthodes dynamiques, en ajoutant flexibilité à notre code.
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!