Comment lier des méthodes non liées en Python sans les invoquer ?

Barbara Streisand
Libérer: 2024-10-30 01:22:03
original
626 Les gens l'ont consulté

How to Bind Unbound Methods in Python Without Invoking Them?

Dissocier le nœud gordien : lier les méthodes non liées de manière transparente

En Python, lier des méthodes non liées sans les invoquer peut présenter un défi de codage. Considérez ce scénario :

<code class="python">class MyWidget(wx.Window):
    buttons = [("OK", OnOK), ("Cancel", OnCancel)]

    def setup(self):
        for text, handler in MyWidget.buttons:
            b = wx.Button(parent, label=text).bind(wx.EVT_BUTTON, handler)</code>
Copier après la connexion

Ici, le gestionnaire représente une méthode non liée, conduisant à des erreurs d'exécution. Bien que functools.partial offre une solution de contournement, les capacités innées de descripteur de Python fournissent une solution élégante.

Dévoilement de la puissance des descripteurs

Toutes les fonctions de Python possèdent des propriétés de descripteur intrinsèques. En tirant parti de leur méthode __get__, les méthodes non liées peuvent être liées à une instance :

<code class="python">bound_handler = handler.__get__(self, MyWidget)</code>
Copier après la connexion

Cette technique permet de lier des méthodes non liées sans déclencher leur exécution.

Un exemple complet

Pour illustrer, implémentons une fonction de liaison personnalisée :

<code class="python">def bind(instance, func, as_name=None):
    if as_name is None:
        as_name = func.__name__
    bound_method = func.__get__(instance, instance.__class__)
    setattr(instance, as_name, bound_method)
    return bound_method</code>
Copier après la connexion

En utilisant cette fonction de liaison, nous pouvons obtenir la fonctionnalité souhaitée :

<code class="python">class Thing:
    def __init__(self, val):
        self.val = val

something = Thing(21)

def double(self):
    return 2 * self.val

bind(something, double)
something.double()  # returns 42</code>
Copier après la connexion

En adoptant le puissance des descripteurs, nous lions sans effort des méthodes non liées, ouvrant ainsi une myriade de possibilités de codage sans compromettre les principes Pythoniques.

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