Home >Backend Development >Python Tutorial >How Can You Dynamically Bind Unbound Methods in Python?
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!