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?

War es hilfreich?

Lösung

def isbound(method):
    return method.im_self is not None

def instance(bounded_method):
    return bounded_method.im_self

Benutzerdefinierte Methoden:

Wenn Sie eine benutzerdefinierte Methode-Objekt ist erstellt durch das abrufen von Benutzer-definiert Funktion Objekt aus einer Klasse, seine im_self Attribut None und die Methode-Objekt ungebunden sein.Wenn man erstellt durch abrufen eines user-defined function-Objekt aus einem Klasse über eine seiner Instanzen, seine im_self Attribut ist die Instanz, und die Methode-Objekt gebunden zu sein.In jedem Fall, die neue Methode im_class Attribut der Klasse aus dem der Abruf erfolgt ist, und seine im_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__, und im_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)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top