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