31

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

このようなもの:

class Test:
    def method(self):
        pass

assert is_instance_method(Test().method)
4

2 に答える 2

52

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引数がメソッド、関数 (s を含む)、またはクラスlambdaのインスタンスである場合、引数は true です。__call__

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

assert inspect.ismethod(Test().method)  
于 2009-08-11T15:10:56.850 に答える
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

通常、それを確認することは悪い考えです。callable()をメソッドと交換可能に使用できる方がより柔軟です。

于 2009-08-11T14:53:48.907 に答える