2009-08-11 4 views
26

Wie kann man prüfen, ob eine Variable eine Instanzmethode ist oder nicht? Ich benutze Python 2.5.Python: Stellen Sie fest, dass die Variable Instanzmethode ist?

Etwas wie folgt aus:

class Test: 
    def method(self): 
     pass 

assert is_instance_method(Test().method) 
+16

Was ist falsch mit der Frage hier? – quano

+3

Das Lesen der Quelle ist keine Hilfe - vermutlich schreibt er einen Code, der die Antwort zur Laufzeit wissen muss. Eventuell alle Attribute eines Objekts durchlaufen. –

Antwort

41

inspect.ismethod ist, was Sie herausfinden möchten, wenn Sie definitiv eine Methode haben, anstatt nur etwas, das Sie anrufen 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, wenn das Argument ist ein Verfahren, eine Funktion (einschließlich lambda s), eine Instanz mit __call__ oder einer Klasse.

Methoden haben andere Eigenschaften als Funktionen (wie im_class und im_self). So wollen Sie

assert inspect.ismethod(Test().method) 
+5

+1, inspizieren ist gut (und das "trotzig" Typo liest eigentlich gut ;-). –

+5

http://www.d-e-f-i-n-i-t-e-l-y.com/ :-) –

+0

Mit Python 3.5 gibt 'inspect.ismethod (Test.method)' false zurück. – Devin

8

Wenn Sie wissen wollen, ob es gerade eine Instanzmethode verwenden Sie die folgende Funktion ist. (Er hält Methoden, die auf einer Metaklasse und Zugriffs einer Klasse Klassenmethoden definiert sind, obwohl sie auch Instanzmethoden in Betracht gezogen werden könnte)

import types 
def is_instance_method(obj): 
    """Checks if an object is a bound method on an instance.""" 
    if not isinstance(obj, types.MethodType): 
     return False # Not a method 
    if obj.im_self is None: 
     return False # Method is not bound 
    if issubclass(obj.im_class, type) or obj.im_class is types.ClassType: 
     return False # Method is a classmethod 
    return True 

der Regel für die Überprüfung ist eine schlechte Idee. Es ist flexibler, in der Lage zu sein, alle aufrufbaren() austauschbar mit Methoden zu verwenden.