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)
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)
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 lambda
s), 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)
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 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.
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.