How Can You Dynamically Bind Unbound Methods in Python?

Barbara Streisand
Release: 2024-10-30 14:21:03
Original
608 people have browsed it

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>
Copy after login

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>
Copy after login

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>
Copy after login

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>
Copy after login

With this function, we can now bind unbound methods as follows:

<code class="python">bind(something, double)
something.double()  # returns 42</code>
Copy after login

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!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template