Ich möchte die Methoden in einer Klasse durchlaufen oder Klassen- oder Instanzobjekte basierend auf den vorhandenen Methoden unterschiedlich behandeln. Wie erhalte ich eine Liste der Klassenmethoden?
Siehe auch:
- Wie kann ich die Methoden in einem Python 2.5-Modul auflisten?
- Durchlaufen einer Python / IronPython-Objektmethode
- Finden der Methoden eines Objekts
- Wie schaue ich in ein Python-Objekt?
- Wie führe ich eine Introspektion an einem Objekt in Python 2.x durch?
- Wie erhalte ich eine vollständige Liste der Methoden und Attribute des Objekts?
- Finden Sie heraus, welche Funktionen von einer Klasseninstanz in Python verfügbar sind?
binding
funktioniert die Verwendung der Compiler-Direktive : stackoverflow.com/a/46041480/1959808[f for f in dir(ClassName) if not f.startswith('_')]
oder einfachdir(ClassName)
für allesAntworten:
Ein Beispiel (Auflistung der Methoden der
optparse.OptionParser
Klasse):Beachten Sie, dass
getmembers
eine Liste mit 2 Tupeln zurückgegeben wird. Das erste Element ist der Name des Mitglieds, das zweite Element ist der Wert.Sie können eine Instanz auch übergeben an
getmembers
:quelle
inspect.isroutine
könnte ein geeigneteres Prädikat sein;inspect.ismethod
funktioniert nicht für alle Objektmethoden.Es gibt die
dir(theobject)
Methode zum Auflisten aller Felder und Methoden Ihres Objekts (als Tupel) und das Inspect-Modul (als Codeape Write) zum Auflisten der Felder und Methoden mit ihrem Dokument (in "" ").Da in Python möglicherweise alles (auch Felder) aufgerufen wird, bin ich mir nicht sicher, ob es eine integrierte Funktion gibt, mit der nur Methoden aufgelistet werden können. Sie könnten versuchen wollen , wenn das Objekt Sie erhalten durch
dir
ist aufrufbar oder nicht.quelle
Python 3.x-Antwort ohne externe Bibliotheken
dunder-ausgeschlossenes Ergebnis:
quelle
Angenommen, Sie möchten alle Methoden kennen, die der Listenklasse zugeordnet sind. Geben Sie einfach Folgendes ein
Oben finden Sie alle Methoden der Listenklasse
quelle
print([ m for m in dir(my_class) if not m.startswith('__')])
Probieren Sie die Eigenschaft
__dict__
.quelle
__dict__
. Allerdings haben Klassen auch eine__dict__
und das sollte die Klassenmethoden anzeigen :)Sie können den FunctionType auch aus Typen importieren und mit folgenden Tests testen
class.__dict__
:quelle
and not x.startswith('_')
am Ende der Liste das Verständnis hinzugefügt , damit ich die__init__
privaten und privaten Methoden ignorieren kann.import
derFunctionType
mit unter Verwendung einer Wegwerf - Lambdatype()
:type(lambda:0)
isinstance
wäre besser alstype(y) == FunctionType
hier.Beachten Sie, dass Sie überlegen müssen, ob Methoden von Basisklassen, die geerbt (aber nicht überschrieben) werden sollen, in das Ergebnis aufgenommen werden sollen. Die Operationen
dir()
undinspect.getmembers()
enthalten Basisklassenmethoden, die Verwendung des__dict__
Attributs jedoch nicht.quelle
Dies funktioniert auch:
mymodule.py
In einer anderen Datei
Ausgabe:
Aus den Python-Dokumenten:
inspect.isroutine (Objekt)
quelle
Damit
Denken Sie an Python Seite 210
quelle
Es gibt diesen Ansatz:
Im Umgang mit einer Klasse Beispiel , vielleicht würde es besser sein , anstatt nur names¹ eine Liste mit den Verfahren Referenzen zurückzukehren. Wenn das auch dein Ziel ist
import
__init__
) von der ListeEs kann von Nutzen sein. Kurz gesagt, für eine Klasse wie
Wir könnten den Instanzabruf mit überprüfen
Sie können es also sofort anrufen:
¹ Ein Anwendungsfall:
Ich habe dies für Unit-Tests verwendet . Hatte eine Klasse, in der alle Methoden Variationen desselben Prozesses durchführten - was zu langwierigen Tests führte, von denen jeder nur eine Optimierung von den anderen entfernt war. TROCKEN war ein weit entfernter Traum.
Ich dachte, ich sollte einen einzigen Test für alle Methoden haben, also habe ich die obige Iteration durchgeführt.
Obwohl mir klar wurde, dass ich stattdessen den Code selbst so umgestalten sollte , dass er sowieso DRY-konform ist ... könnte dies auch in Zukunft einer zufälligen, pingeligen Seele dienen.
quelle
Ich behalte das einfach dort, weil die am besten bewerteten Antworten nicht klar sind .
Dies ist ein einfacher Test mit einer nicht üblichen Klasse, die auf Enum basiert.
Und das sind Ausgabeergebnisse.
Also was wir haben:
dir
Geben Sie keine vollständigen Daten aninspect.getmembers
Geben Sie nicht vollständige Daten und interne Schlüssel an, auf die nicht zugegriffen werden kanngetattr()
__dict__.keys()
liefern vollständige und zuverlässige ErgebnisseWarum sind Stimmen so falsch? Und wo irre ich mich? Und wo falsch andere Leute, deren Antworten so niedrige Stimmen haben?
quelle
gibt eine identische Liste wie
tut.
quelle
Wenn Ihre Methode eine „normale“ Verfahren und nicht um eine
statimethod
,classmethod
usw.Es gibt einen kleinen Hack kam ich mit -
Dies kann auf andere Arten von Methoden erweitert werden, indem "Funktion" in der
if
Bedingung entsprechend geändert wird.Getestet auf Python 2.7.
quelle
Sie können alle Methoden in einer Python-Klasse mithilfe des folgenden Codes auflisten
Dies gibt eine Liste aller Namen der Methoden in der Klasse zurück
quelle
Ich weiß, dass dies ein alter Beitrag ist, habe aber gerade diese Funktion geschrieben und werde sie hier belassen, falls jemand stolpert und nach einer Antwort sucht:
quelle
Dies ist nur eine Beobachtung. "encode" scheint eine Methode für String-Objekte zu sein
Wenn str1 jedoch auf Methoden überprüft wird, wird eine leere Liste zurückgegeben
Vielleicht irre ich mich, aber das Problem scheint nicht einfach zu sein.
quelle
'a'
ist ein Objekt, dessen Typ iststr
. Sie können dies sehen, indem Sie ausführentype('a')
.inspect.getmember()
Nimmt einen Typparameter, müssen Sie aufrufen, uminspect.getmember(str)
zu sehen, was Sie erwarten.Ausgabe
quelle
Wenn Sie nur Methoden einer Python-Klasse auflisten möchten
quelle