Maison >développement back-end >Tutoriel Python >Comment lier des méthodes non liées en Python sans les invoquer ?

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

Barbara Streisand
Barbara Streisandoriginal
2024-10-30 01:22:03632parcourir

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>

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>

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>

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>

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!

Déclaration:
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