web-dev-qa-db-ja.com

Python:変数がインスタンスメソッドであることを表明しますか?

変数がインスタンスメソッドであるかどうかをどのように確認できますか?私はpython 2.5を使用しています。

このようなもの:

class Test:
    def method(self):
        pass

assert is_instance_method(Test().method)
27
quano

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

引数がメソッド、関数(callablesを含む)、__call__を持つインスタンス、またはクラスの場合、引数がlambdaの場合はtrueです。

メソッドには、関数とは異なるプロパティがあります(im_classim_selfなど)。あなたが望んでいるのは

assert inspect.ismethod(Test().method)  
45
Tom Dunham

それが正確にインスタンスメソッドであるかどうかを知りたい場合は、次の関数を使用してください。 (メタクラスで定義され、クラスクラスメソッドでアクセスされるメソッドを考慮しますが、インスタンスメソッドと見なすこともできます)

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()をメソッドと交換可能に使用できる方が柔軟性があります。

8
Ants Aasma