Heim >Backend-Entwicklung >Python-Tutorial >Wie binde ich ungebundene Methoden in Python, ohne sie aufzurufen?

Wie binde ich ungebundene Methoden in Python, ohne sie aufzurufen?

Barbara Streisand
Barbara StreisandOriginal
2024-10-30 01:22:03633Durchsuche

How to Bind Unbound Methods in Python Without Invoking Them?

Den Gordischen Knoten lösen: Ungebundene Methoden nahtlos binden

In Python kann das Binden ungebundener Methoden, ohne sie aufzurufen, eine Codierungsherausforderung darstellen. Stellen Sie sich dieses Szenario vor:

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

Hier stellt der Handler eine ungebundene Methode dar, die zu Laufzeitfehlern führt. Während functools.partial eine Problemumgehung bietet, bieten die in Python integrierten Deskriptorfunktionen eine elegante Lösung.

Enthüllung der Leistungsfähigkeit von Deskriptoren

Alle Funktionen in Python verfügen über intrinsische Deskriptoreigenschaften. Durch die Nutzung ihrer __get__-Methode können ungebundene Methoden an eine Instanz gebunden werden:

<code class="python">bound_handler = handler.__get__(self, MyWidget)</code>

Diese Technik ermöglicht die Bindung ungebundener Methoden, ohne deren Ausführung auszulösen.

Ein umfassendes Beispiel

Zur Veranschaulichung implementieren wir eine benutzerdefinierte Bindungsfunktion:

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

Mit dieser Bindungsfunktion können wir die gewünschte Funktionalität erreichen:

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

Indem wir die Mit der Kraft der Deskriptoren binden wir mühelos ungebundene Methoden und erschließen so eine Vielzahl von Codierungsmöglichkeiten, ohne Kompromisse bei den Python-Prinzipien einzugehen.

Das obige ist der detaillierte Inhalt vonWie binde ich ungebundene Methoden in Python, ohne sie aufzurufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn