Question

En Python je dois tester efficacement et génériquement si un attribut d'une classe est une méthode d'instance. Les entrées à l'appel serait le nom de l'attribut en cours de vérification (une chaîne) et un objet.

hasattr retourne vrai indépendamment du fait que l'attribut est une méthode d'instance ou non.

Toutes les suggestions?


Par exemple:

class Test(object):
    testdata = 123

    def testmethod(self):
        pass

test = Test()
print ismethod(test, 'testdata') # Should return false
print ismethod(test, 'testmethod') # Should return true
Était-ce utile?

La solution

def hasmethod(obj, name):
    return hasattr(obj, name) and type(getattr(obj, name)) == types.MethodType

Autres conseils

import types

print isinstance(getattr(your_object, "your_attribute"), types.MethodType)

Vous pouvez utiliser le module inspect:

class A(object):
    def method_name(self):
        pass


import inspect

print inspect.ismethod(getattr(A, 'method_name')) # prints True
a = A()
print inspect.ismethod(getattr(a, 'method_name')) # prints True

Cette fonction vérifie si l'attribut existe et puis vérifie si l'attribut est une méthode à l'aide du module inspect.

import inspect

def ismethod(obj, name):
    if hasattr(obj, name):
        if inspect.ismethod(getattr(obj, name)):
            return True
    return False

class Foo:
    x = 0
    def bar(self):
        pass

foo = Foo()
print ismethod(foo, "spam")
print ismethod(foo, "x")
print ismethod(foo, "bar")
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top