Python: утверждать, что переменная является методом экземпляра? - PullRequest
27 голосов
/ 11 августа 2009

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

Примерно так:

class Test:
    def method(self):
        pass

assert is_instance_method(Test().method)

Ответы [ 2 ]

44 голосов
/ 11 августа 2009

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)  
8 голосов
/ 11 августа 2009

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

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 () взаимозаменяемо с методами.

...