Wie tun Sie überprüfen, ob eine python-Methode gebunden ist oder nicht?
-
09-06-2019 - |
Frage
Eine Referenz auf eine Methode, gibt es eine Möglichkeit zu überprüfen, ob die Methode an ein Objekt gebunden oder nicht?Können Sie auch den Zugriff auf die Instanz, die es gebunden ist, zu?
Lösung
def isbound(method):
return method.im_self is not None
def instance(bounded_method):
return bounded_method.im_self
Wenn Sie eine benutzerdefinierte Methode-Objekt ist erstellt durch das abrufen von Benutzer-definiert Funktion Objekt aus einer Klasse, seine
im_self
AttributNone
und die Methode-Objekt ungebunden sein.Wenn man erstellt durch abrufen eines user-defined function-Objekt aus einem Klasse über eine seiner Instanzen, seineim_self
Attribut ist die Instanz, und die Methode-Objekt gebunden zu sein.In jedem Fall, die neue Methodeim_class
Attribut der Klasse aus dem der Abruf erfolgt ist, und seineim_func
Attribut ist das original Funktion Objekt.
In Python 2.6 und 3.0:
Instanz-Methode Objekte haben neue Attribute für das Objekt und Funktion aus der Methode;neue Synonyme für
im_self
ist__self__
, undim_func
auch erhältlich als__func__
.Die alten Namen werden noch unterstützt Python 2.6, aber sind verschwunden 3.0.
Andere Tipps
In python 3 __self__
Attribut nur legen Sie auf bound-Methoden.Es ist nicht festgelegt None
auf der Ebene der Funktionen (oder ungebundene Methoden, die sind einfach nur Funktionen in python 3).
Verwenden Sie so etwas wie dieses:
def is_bound(m):
return hasattr(m, '__self__')
Die gewählte Antwort ist gültig in fast allen Fällen.Wenn jedoch die überprüfung, ob eine Methode gebunden ist, die in einen Dekorator verwenden gewählte Antwort, die Prüfung fehl.Betrachten Sie dieses Beispiel Dekorateur und Methode:
def my_decorator(*decorator_args, **decorator_kwargs):
def decorate(f):
print(hasattr(f, '__self__'))
@wraps(f)
def wrap(*args, **kwargs):
return f(*args, **kwargs)
return wrap
return decorate
class test_class(object):
@my_decorator()
def test_method(self, *some_params):
pass
Die print
Anweisung in Dekorator drucken False
.In diesem Fall kann ich nicht finden einen anderen Weg, aber auf Funktion prüfen-Parameter mit Ihr argument-Namen, und suchen Sie nach einem Namen self
.Dies ist auch nicht garantiert zu funktionieren einwandfrei, weil das erste argument einer Methode ist nicht gezwungen zu werden, benannt self
und können einen beliebigen anderen Namen ein.
import inspect
def is_bounded(function):
params = inspect.signature(function).parameters
return params.get('self', None) is not None
im_self Attribut (nur Python 2)