2009-08-11 2 views
26

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

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

class Test: 
    def method(self): 
     pass 

assert is_instance_method(Test().method) 
+16

Что не так с просьбой здесь? – quano

+3

Чтение источника не поможет - возможно, он пишет код, который должен знать ответ во время выполнения. Возможно, итерация через все attrs на объект, например. –

ответ

41

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 с), экземпляр с __call__ или класса.

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

assert inspect.ismethod(Test().method) 
+5

+1, проверьте, хорошо (и что «вызывающе» опечатка на самом деле хорошо читается ;-). –

+5

http://www.d-e-f-i-n-i-t-e-l-y.com/ :-) –

+0

Используя Python 3.5, 'inspect.ismethod (Test.method)' возвращает False. – Devin

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 

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

Смежные вопросы