Je veux parcourir les méthodes d'une classe ou gérer les objets de classe ou d'instance différemment en fonction des méthodes présentes. Comment obtenir une liste des méthodes de classe?
Regarde aussi:
- Comment puis-je répertorier les méthodes dans un module Python 2.5?
- Boucler sur un objet Python / IronPython Méthodes
- Recherche des méthodes d'un objet
- Comment regarder à l'intérieur d'un objet Python?
- Comment effectuer une introspection sur un objet dans Python 2.x?
- Comment obtenir une liste complète des méthodes et attributs de l'objet?
- Découvrir quelles fonctions sont disponibles à partir d'une instance de classe en python?
binding
fonctionne: stackoverflow.com/a/46041480/1959808[f for f in dir(ClassName) if not f.startswith('_')]
ou justedir(ClassName)
pour toutRéponses:
Un exemple (listant les méthodes de la
optparse.OptionParser
classe):Notez que
getmembers
retourne une liste de 2 tuples. Le premier élément est le nom du membre, le deuxième élément est la valeur.Vous pouvez également transmettre une instance à
getmembers
:la source
inspect.isroutine
pourrait être un prédicat plus approprié;inspect.ismethod
ne fonctionne pas pour toutes les méthodes des objets.Il y a la
dir(theobject)
méthode pour lister tous les champs et méthodes de votre objet (en tant que tuple) et le module inspect (en écriture codeape) pour lister les champs et méthodes avec leur doc (en "" ").Parce que tout (même les champs) peut être appelé en Python, je ne suis pas sûr qu'il existe une fonction intégrée pour répertorier uniquement les méthodes. Vous voudrez peut-être essayer si l' objet que vous traversez
dir
est appelable ou non.la source
Réponse Python 3.x sans bibliothèques externes
résultat exclu du dunder:
la source
Dites que vous voulez connaître toutes les méthodes associées à la classe de liste
Ci-dessus vous donnera toutes les méthodes de classe de liste
la source
print([ m for m in dir(my_class) if not m.startswith('__')])
Essayez la propriété
__dict__
.la source
__dict__
. Cependant les classes en ont__dict__
aussi et cela devrait afficher les méthodes de classe :)vous pouvez également importer le FunctionType à partir de types et le tester avec
class.__dict__
:la source
and not x.startswith('_')
à la fin de la liste la compréhension pour mon utilisation pour ignorer__init__
les méthodes privées et.import
deFunctionType
l'aide d' un lambda avec jetabletype()
:type(lambda:0)
isinstance
serait mieuxtype(y) == FunctionType
qu'ici.Notez que vous devez déterminer si vous souhaitez que les méthodes des classes de base héritées (mais non substituées) soient incluses dans le résultat. Les opérations
dir()
etinspect.getmembers()
incluent des méthodes de classe de base, mais pas l'utilisation de l'__dict__
attribut.la source
Cela fonctionne également:
mymodule.py
Dans un autre fichier
production:
Depuis les documents python:
inspect.isroutine (objet)
la source
Alors
Pensez Python page 210
la source
Il y a cette approche:
Lorsqu'il s'agit d'une instance de classe , il serait peut-être préférable de renvoyer une liste avec les références de méthode au lieu de simplement des noms¹. Si tel est votre objectif, ainsi que
import
__init__
) de la listeCela peut être utile. En un mot, pour une classe comme
Nous pourrions vérifier la récupération d'instance avec
Vous pouvez donc l'appeler tout de suite:
¹ Un cas d'utilisation:
Je l'ai utilisé pour les tests unitaires . Il y avait une classe où toutes les méthodes effectuaient des variations du même processus - ce qui conduisait à de longs tests, chacun à seulement un coup d'œil des autres. SEC était un rêve lointain.
Je pensais que je devrais avoir un seul test pour toutes les méthodes, j'ai donc fait l'itération ci-dessus.
Bien que je me sois rendu compte que je devrais à la place refactoriser le code lui-même pour qu'il soit conforme à DRY de toute façon ... cela pourrait encore servir une âme au hasard à l'avenir.
la source
Je garde cela là, car les réponses les mieux notées ne sont pas claires .
Il s'agit d'un test simple avec une classe inhabituelle basée sur Enum.
Et ce sont les résultats de sortie.
Donc ce que nous avons:
dir
fournir des données incomplètesinspect.getmembers
fournir des données incomplètes et fournir des clés internes qui ne sont pas accessibles avecgetattr()
__dict__.keys()
fournir un résultat complet et fiablePourquoi les votes sont-ils si erronés? Et où je me trompe? Et où se trompent les autres personnes qui répondent ont des votes si bas?
la source
donne une liste identique à
Est-ce que.
la source
Vous pouvez répertorier toutes les méthodes d'une classe python à l'aide du code suivant
Cela renverra une liste de tous les noms des méthodes de la classe
la source
Si votre méthode est une méthode "régulière" et non pas une
statimethod
,classmethod
etc.Il y a un petit hack que j'ai trouvé -
Cela peut être étendu à d'autres types de méthodes en changeant "fonction" dans la
if
condition en conséquence.Testé sur python 2.7.
la source
Je sais que c'est un ancien article, mais je viens d'écrire cette fonction et je la laisserai ici au cas où quelqu'un trébucherait à la recherche d'une réponse:
la source
Ce n'est qu'une observation. "encoder" semble être une méthode pour les objets chaîne
Cependant, si str1 est inspecté pour les méthodes, une liste vide est retournée
Alors, je me trompe peut-être, mais le problème ne semble pas simple.
la source
'a'
est un objet dont le type eststr
. Vous pouvez le voir en exécutanttype('a')
.inspect.getmember()
prend un paramètre de type, vous devez donc appelerinspect.getmember(str)
pour voir ce que vous attendez.production
la source
Si vous souhaitez répertorier uniquement les méthodes d'une classe python
la source