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!