Python:断言变量是实例方法?

时间:2009-08-11 12:10:55

标签: python methods instance assert

如何检查变量是否为实例方法?我正在使用python 2.5。

这样的事情:

class Test:
    def method(self):
        pass

assert is_instance_method(Test().method)

2 个答案:

答案 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_classim_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()更灵活。