2009-07-07 11 views
3

En Python, je dois tester de manière efficace et générique si un attribut d'une classe est une méthode d'instance. Les entrées de l'appel seraient le nom de l'attribut en cours de vérification (une chaîne) et un objet. Hasattr renvoie true, que l'attribut soit une méthode d'instance ou non.Comment tester si un attribut de classe est une méthode d'instance

Des 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 
+1

Etes-vous sûr de vouloir savoir que c'est une méthode? N'avez-vous pas vraiment envie de savoir si vous pouvez l'appeler? Ce ne sont pas nécessairement la même chose (bien qu'ils le soient souvent). –

+0

Quel est le problème avec la lecture de la source? C'est Python - vous avez la source - pourquoi ne pouvez-vous pas simplement le lire? –

+3

La lecture de la source n'est pas utile - il écrit probablement du code qui doit connaître la réponse à l'exécution. Peut-être itérer à travers tout attr sur un objet, par exemple. –

Répondre

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

Sachez que "getattr" peut impliquer l'exécution de code. Cette réponse obtient la valeur de l'attribut "name" d'obj, puis teste le type de cette valeur. Si vous utilisez Python 3, importez import, et remplacez "getattr" par "inspect.getattr_static", ce qui évite cette évaluation. http://docs.python.org/3.3/library/inspect.html#fetching-attributes-static – ToolmakerSteve

4
import types 

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

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 
1

Cette fonction vérifie si l'attribut existe et vérifie si l'attribut est une méthode utilisant le inspect module.

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") 
Questions connexes