如何检查变量是否为实例方法?我正在使用python 2.5。
这样的事情:
class Test:
def method(self):
pass
assert is_instance_method(Test().method)
答案 0 :(得分:44)
inspect.ismethod
是你想要找到的,如果你肯定有一个方法,而不仅仅是你可以调用的东西。
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
s),具有lambda
的实例或类,则 __call__
为真。
方法具有与函数不同的属性(如im_class
和im_self
)。所以你想要
assert inspect.ismethod(Test().method)
答案 1 :(得分:8)
如果您想知道它是否恰好是实例方法,请使用以下函数。 (它考虑在元类上定义并在类类方法上访问的方法,尽管它们也可以被视为实例方法)
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
通常检查这是一个坏主意。能够与方法交替使用任何 callable()更灵活。