Comment pouvons-nous invoquer dynamiquement des méthodes de classe sur des modules en Python ?

DDD
Libérer: 2024-10-30 01:22:28
original
811 Les gens l'ont consulté

How can we dynamically invoke class methods on modules in Python?

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 :

  1. xxx sont spécifiques à la classe et ne sont pas accessibles sur les modules.
  2. 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!

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!