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!