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