33 Stimmen

Python: Behaupten, dass Variable eine Instanzmethode ist?

Wie kann man überprüfen, ob eine Variable eine Instanzmethode ist oder nicht? Ich benutze Python 2.5.

So etwas wie das:

class Test:
    def method(self):
        pass

assert is_instance_method(Test().method)

18 Stimmen

Was ist falsch daran, hier zu fragen?

3 Stimmen

Das Lesen der Quelle ist keine Hilfe - wahrscheinlich schreibt er gerade etwas Code, der die Antwort zur Laufzeit kennen muss. Möglicherweise iteriert er beispielsweise durch alle Attribute eines Objekts.

55voto

Tom Dunham Punkte 5611

inspect.ismethod ist das, was Sie herausfinden möchten, wenn Sie definitiv eine Methode haben, und nicht nur etwas, das Sie aufrufen können.

import inspect

def foo(): pass

class Test(object):
    def method(self): pass

print inspect.ismethod(foo) # False
print inspect.ismethod(Test) # False
print inspect.ismethod(Test.method) # True
print inspect.ismethod(Test().method) # True

print callable(foo) # True
print callable(Test) # True
print callable(Test.method) # True
print callable(Test().method) # True

callable ist wahr, wenn das Argument eine Methode, eine Funktion (einschließlich lambdas), eine Instanz mit __call__ oder eine Klasse ist.

Methoden haben verschiedene Eigenschaften als Funktionen (wie im_class und im_self). Also wollen Sie

assert inspect.ismethod(Test().method)

8voto

Ants Aasma Punkte 50286

Wenn Sie wissen möchten, ob es genau eine Instanzmethode ist, verwenden Sie die folgende Funktion. (Es betrachtet Methoden, die in einer Metaklasse definiert sind und als Klassenmethoden aufgerufen werden, obwohl sie auch als Instanzmethoden betrachtet werden könnten)

import types
def is_instance_method(obj):
    """Überprüft, ob ein Objekt eine gebundene Methode auf einer Instanz ist."""
    if not isinstance(obj, types.MethodType):
        return False # Keine Methode
    if obj.im_self is None:
        return False # Methode ist nicht gebunden
    if issubclass(obj.im_class, type) or obj.im_class is types.ClassType:
        return False # Methode ist eine Klassenmethode
    return True

Normalerweise ist es keine gute Idee, das zu überprüfen. Es ist flexibler, jede aufrufbare() Methode austauschbar verwenden zu können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X