Dans Python, j'ai besoin de tester efficacement et génériquement si un attribut d'une classe est une méthode d'instance. Les entrées à l'appel seraient le nom de l'attribut vérifié (une chaîne) et un objet.
hasattr renvoie true si l'attribut est une méthode d'instance ou non. P>
Toute suggestion? p>
Par exemple: p>
5 Réponses :
import types print isinstance(getattr(your_object, "your_attribute"), types.MethodType)
def hasmethod(obj, name): return hasattr(obj, name) and type(getattr(obj, name)) == types.MethodType
Sachez que "getattr" peut impliquer une exécution de code. Cette réponse obtient la valeur de l'attribut "Nom" de l'OBJ, puis teste le type de cette valeur. Si vous utilisez Python 3, Importer inspecter et remplacer "getattr" par "inspecter.getattr_static", ce qui évite cette évaluation. docs.python.org/3.3/Library/...
Cela ne fonctionne que si vous souhaitez simplement vérifier si la méthode est une méthode d'instance, elle ne permet pas de déterminer si la méthode se lie à l'instance actuelle.
Vous pouvez utiliser le module Inspecter code>:
La question pose une fonction qui retournerait false code> pour votre exemple de capital
A code> et true pour votre exemple en minuscule "A", c'est-à-dire une attribution d'objet, à partir d'un attribut d'objet, Comment pouvons-nous dire s'il est appelable et que c'est l'attribut de l'instance, pas B> Attribut de classe (une fonction de membre statique).
Cette fonction vérifie si l'attribut existe, puis vérifie si l'attribut est une méthode à l'aide du module code> Inspecter code>.
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")
Sachez que ÇA fonctionne car @ClassMethod code> -Décoté fonctionne tous les tests d'autres réponses. Voulez-vous que ceux-ci soient considérés comme des «méthodes d'instance»? Peut-être que ce n'est que la sémantique, mais ils fonctionnent par définition sur la classe, pas l'instance engagée. Je ne suis pas sûr des cas où HasMethod2 (ma solution proposée) échoue, mais au moins cela peut être méfiant des méthodes de classe:
__ auto __ code> est lié à l'argument d'appel principal (instance de classe pour ClassMethod, instance d'objet pour des attributs normaux, module ou rien pour diverses intégrées). Ainsi, la vérification de l'existence de
__ auto __ __ code> et que
__ auto __ code> n'est pas une classe de classe des attributs non-fonctions et des méthodes de classe, respectivement. P> p>
Êtes-vous sûr d'avoir besoin de savoir que c'est une méthode? Tu n'es vraiment pas vraiment démangeaisons de savoir si vous pouvez l'appeler? Ce ne sont pas nécessairement la même chose (bien que bien sûr, ils sont souvent).
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?
La lecture de la source n'est pas une aide - vraisemblablement, il écrit du code qui doit connaître la réponse au moment de l'exécution. Éventuellement itérant à travers tous les attraists d'un objet, par exemple.