Bind Unbound Methods Dynamically
In Python, we often encounter situations where we need to bind an unbound method to an instance without invoking it. This can be a valuable technique in various scenarios, such as creating dynamic GUIs or handling events in a structured manner.
The Problem of Exploding Programs
Consider the following code snippet:
<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>
The issue here is that handler represents unbound methods, causing the program to crash with an error. To resolve this, we need a way to bind these unbound methods to the specific instance of MyWidget.
The Power of Descriptors
Python's methods are also descriptors, which provide a way to bind them dynamically. By calling the special __get__ method on the unbound method, we can obtain a bound method:
<code class="python">bound_handler = handler.__get__(self, MyWidget)</code>
By assigning the bound method to a class-level attribute, we can effectively bind it to the instance:
<code class="python">setattr(self, handler.__name__, bound_handler)</code>
A Reusable Binding Function
Using this technique, we can create a reusable function to bind unbound methods:
<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>
With this function, we can now bind unbound methods as follows:
<code class="python">bind(something, double) something.double() # returns 42</code>
The above is the detailed content of How Can You Dynamically Bind Unbound Methods in Python?. For more information, please follow other related articles on the PHP Chinese website!