Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich ungebundene Methoden in Python binden, ohne den Aufruf auszulösen?

Wie kann ich ungebundene Methoden in Python binden, ohne den Aufruf auszulösen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-02 11:26:02718Durchsuche

How Can I Bind Unbound Methods in Python Without Triggering Invocation?

Binden ungebundener Methoden ohne Aufruf

In Python kann die Definition einer Liste von Tupeln auf Klassenebene, wobei jedes Tupel eine Schaltfläche und den entsprechenden Ereignishandler darstellt, die Datenorganisation verbessern. Allerdings kann das Binden ungebundener Methoden an eine Instanz, ohne ihre Ausführung auszulösen, eine Herausforderung darstellen.

Das Problem tritt auf, wenn es sich bei den Event-Handler-Werten um ungebundene Methoden handelt, was zu Laufzeitfehlern führt. Während functools.partial eine Problemumgehung bietet, besteht ein eher pythonischer Ansatz darin, das Deskriptorverhalten von Funktionen auszunutzen.

Deskriptoren, einschließlich Funktionen, verfügen über eine __get__-Methode, die bei Aufruf die Funktion an eine Instanz bindet. Mit dieser Methode können wir ungebundene Methoden wie folgt binden:

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

Diese Technik bindet den ungebundenen Methodenhandler effektiv an die MyWidget-Instanz, ohne ihn aufzurufen.

Alternativ kann eine wiederverwendbare Funktion gekapselt werden diese Bindungslogik:

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

Diese Funktion ermöglicht eine flexible Bindung mit benutzerdefinierten Namen:

<code class="python">something = Thing(21)

def double(self):
    return 2 * self.val

bind(something, double)
something.double()  # returns 42</code>

Das obige ist der detaillierte Inhalt vonWie kann ich ungebundene Methoden in Python binden, ohne den Aufruf auszulösen?. 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