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

StackOverflow https://stackoverflow.com/questions/1259963

Вопрос

Как можно проверить, является ли переменная методом экземпляра или нет? Я использую 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 это правда, если аргумент, если аргумент - это метод, функция (включая lambdaS), экземпляр с __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 () взаимозаменяемо с методами.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top