Подтвердить что ты не робот

Python: утверждать, что переменная является методом экземпляра?

Как проверить, является ли переменная методом экземпляра или нет? Я использую python 2.5.

Что-то вроде этого:

class Test:
    def method(self):
        pass

assert is_instance_method(Test().method)
4b9b3361

Ответ 1

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 является истинным, если аргумент, если аргумент является методом, функцией (включая lambda s), экземпляром с __call__ или классом.

Методы имеют разные свойства, чем функции (например, im_class и im_self). Итак, вы хотите

assert inspect.ismethod(Test().method)  

Ответ 2

Если вы хотите узнать, использует ли именно метод экземпляра следующую функцию. (Он рассматривает методы, которые определены в метаклассе и доступны для методов класса, хотя они также могут рассматриваться как методы экземпляров)

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

Обычно проверка на это - плохая идея. Более гибко использовать любые вызываемые() взаимозаменяемые методы.