Python: утверждайте, что переменная - это метод экземпляра?
Вопрос
Как можно проверить, является ли переменная методом экземпляра или нет? Я использую Python 2.5.
Что-то вроде этого:
class Test:
def method(self):
pass
assert is_instance_method(Test().method)
Решение
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)
Другие советы
Если вы хотите знать, является ли это именно методом экземпляра, используйте следующую функцию. (Он рассматривает методы, которые определяются на MetaClass и доступны по методам класса класса, хотя их также можно рассмотреть методы экземпляра)
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
Обычно проверять это - плохая идея. Более гибко иметь возможность использовать любой Callible () взаимозаменяемо с методами.