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

qua*_*ano 27 python methods assert instance

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

像这样的东西:

class Test:
    def method(self):
        pass

assert is_instance_method(Test().method)
Run Code Online (Sandbox Code Playgroud)

Tom*_*ham 45

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
Run Code Online (Sandbox Code Playgroud)

callable如果参数是一个方法,一个函数(包括lambdas),一个带有__call__或一个类的实例,则为true .

方法具有与函数不同的属性(如im_classim_self).所以你要

assert inspect.ismethod(Test().method)  
Run Code Online (Sandbox Code Playgroud)

  • +1,检查是好的(并且"挑衅"错字实际上读得很好;-). (5认同)
  • 使用 Python 3.5,`inspect.ismmethod(Test.method)` 返回 False。 (5认同)

Ant*_*sma 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
Run Code Online (Sandbox Code Playgroud)

通常检查这是一个坏主意.能够与方法交替使用任何callable()更灵活.