Comment puis-je lier des méthodes non liées en Python sans déclencher d'invocation ?

Mary-Kate Olsen
Libérer: 2024-11-02 11:26:02
original
726 Les gens l'ont consulté

How Can I Bind Unbound Methods in Python Without Triggering Invocation?

Liaison de méthodes non liées sans invocation

En Python, définir une liste de tuples au niveau de la classe où chaque tuple représente un bouton et son gestionnaire d'événements correspondant peut améliorer l'organisation des données. Cependant, lier des méthodes indépendantes à une instance sans déclencher leur exécution peut poser un défi.

Le problème survient lorsque les valeurs du gestionnaire d'événements sont des méthodes indépendantes, entraînant des erreurs d'exécution. Bien que functools.partial propose une solution de contournement, une approche plus pythonique consiste à exploiter le comportement des descripteurs des fonctions.

Les descripteurs, y compris les fonctions, ont une méthode __get__ qui, lorsqu'elle est appelée, lie la fonction à une instance. En utilisant cette méthode, nous pouvons lier les méthodes indépendantes comme suit :

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

Cette technique lie efficacement le gestionnaire de méthode indépendante à l'instance MyWidget sans l'appeler.

Alternativement, une fonction réutilisable peut encapsuler cette logique de liaison :

<code class="python">def bind(instance, func, as_name=None):
    """
    Bind the function *func* to *instance*, with either provided name *as_name*
    or the existing name of *func*. The provided *func* should accept the 
    instance as the first argument, i.e. "self".
    """
    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

Cette fonction permet une liaison flexible avec des noms personnalisés :

<code class="python">something = Thing(21)

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

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

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
À 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!