12
votes

Comment tester si un attribut de classe est une méthode d'instance

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.

Toute suggestion?


Par exemple: xxx


3 commentaires

Ê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.


5 Réponses :


6
votes
import types

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

0 commentaires

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

2 commentaires

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.



6
votes

Vous pouvez utiliser le module Inspecter : xxx


1 commentaires

La question pose une fonction qui retournerait false pour votre exemple de capital A 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 Attribut de classe (une fonction de membre statique).



4
votes

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


0 commentaires

0
votes

Sachez que @ClassMethod -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: xxx

ÇA fonctionne car __ auto __ 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 __ __ et que __ auto __ n'est pas une classe de classe des attributs non-fonctions et des méthodes de classe, respectivement.


0 commentaires