Gibt es eine Möglichkeit, eine Liste von Attributen abzurufen, die in Instanzen einer Klasse vorhanden sind?
class new_class():
def __init__(self, number):
self.multi = int(number) * 2
self.str = str(number)
a = new_class(2)
print(', '.join(a.SOMETHING))
Das gewünschte Ergebnis ist, dass "multi, str" ausgegeben wird. Ich möchte, dass die aktuellen Attribute aus verschiedenen Teilen eines Skripts angezeigt werden.
python
class
python-3.x
MadSc13ntist
quelle
quelle
NewClass
. Sie können den Erwartungen der Leute trotzen, wenn Sie eine Namenskonvention wie verwendennew_class
.help()
hilft die Funktion beim Abrufen von Informationen zu Klassen, Funktionen, integrierten Funktionen, Modulen und mehrAntworten:
Möglicherweise finden Sie auch pprint hilfreich.
quelle
pprint.pprint(a.__dict__)
die Attribute hübsch gedruckt.pprint
funktioniert das NICHT unter Python 2.6.Dann können Sie testen, mit welchem Typ
type()
oder ob es sich um eine Methode handeltcallable()
.quelle
boston
Datensatz von sklearn erhalten habe -__dict__
war leer, obwohl tatsächlich 5 Attribute verfügbar warenvars(obj)
Gibt die Attribute eines Objekts zurück.quelle
Alle vorherigen Antworten sind korrekt. Sie haben drei Möglichkeiten für das, was Sie fragen
dir()
vars()
__dict__
quelle
vars(foo)
Rückkehrfoo.__dict__
Dadurch werden natürlich alle Methoden oder Attribute in der Klassendefinition gedruckt. Sie können „private“ Methoden ausschließen , indem Sie
i.startwith('__')
aufi.startwith('_')
quelle
Das Inspektionsmodul bietet einfache Möglichkeiten zum Inspizieren eines Objekts:
Mit
getmembers()
können Sie alle Attribute Ihrer Klasse zusammen mit ihrem Wert anzeigen. Um private oder geschützte Attribute auszuschließen, verwenden Sie.startswith('_')
. Um Methoden oder Funktionen auszuschließen, verwenden Sieinspect.ismethod()
oderinspect.isfunction()
.Beachten Sie, dass dies
ismethod()
für das zweite Element von verwendet wird,i
da das erste einfach eine Zeichenfolge (deren Name) ist.Offtopic: Verwenden Sie CamelCase für Klassennamen.
quelle
Sie können verwenden
dir(your_object)
, um die Attribute und zu erhaltengetattr(your_object, your_object_attr)
die Werte abzurufenVerwendungszweck :
Dies ist besonders nützlich, wenn Ihr Objekt kein __dict__ hat. Wenn dies nicht der Fall ist, können Sie auch var (your_object) ausprobieren
quelle
Es wird oft erwähnt, dass Sie eine vollständige Liste der Attribute auflisten sollten, die Sie verwenden sollten
dir()
. Beachten Sie jedoch, dass entgegen der landläufigen Meinungdir()
nicht alle Attribute hervorgehoben werden. Beispielsweise stellen Sie möglicherweise fest, dass__name__
dies in derdir()
Liste einer Klasse möglicherweise fehlt , obwohl Sie von der Klasse selbst darauf zugreifen können. Ab dem Dokumentdir()
( Python 2 , Python 3 ):Eine Funktion wie die folgende ist in der Regel vollständiger, obwohl es keine Garantie für die Vollständigkeit gibt, da die von zurückgegebene Liste
dir()
von vielen Faktoren beeinflusst werden kann, einschließlich der Implementierung der__dir__()
Methode oder der Anpassung__getattr__()
oder__getattribute__()
der Klasse oder eines ihrer übergeordneten Elemente. Weitere Informationen finden Sie unter den bereitgestellten Links.quelle
Wofür willst du das? Es kann schwierig sein, die beste Antwort zu erhalten, ohne Ihre genaue Absicht zu kennen.
Es ist fast immer besser, dies manuell zu tun, wenn Sie eine Instanz Ihrer Klasse auf eine bestimmte Weise anzeigen möchten. Dies beinhaltet genau das, was Sie wollen und nicht das, was Sie nicht wollen, und die Reihenfolge ist vorhersehbar.
Wenn Sie nach einer Möglichkeit suchen, den Inhalt einer Klasse anzuzeigen, formatieren Sie die Attribute, die Sie interessieren, manuell und geben Sie diese als
__str__
oder__repr__
Methode für Ihre Klasse an.Wenn Sie wissen möchten, welche Methoden und solche für ein Objekt vorhanden sind, um zu verstehen, wie es funktioniert, verwenden Sie
help
.help(a)
zeigt Ihnen eine formatierte Ausgabe über die Klasse des Objekts basierend auf den Dokumentzeichenfolgen.dir
existiert zum programmgesteuerten Abrufen aller Attribute eines Objekts. (Der Zugriff__dict__
bewirkt etwas, das ich als dasselbe gruppieren würde, das ich aber nicht selbst verwenden würde.) Dies beinhaltet jedoch möglicherweise nicht die gewünschten Dinge und möglicherweise auch die Dinge, die Sie nicht möchten. Es ist unzuverlässig und die Leute denken, sie wollen es viel öfter als sie.Etwas orthogonal gibt es derzeit nur sehr wenig Unterstützung für Python 3. Wenn Sie daran interessiert sind, echte Software zu schreiben, möchten Sie Inhalte von Drittanbietern wie numpy, lxml, Twisted, PIL oder eine beliebige Anzahl von Webframeworks, die Python 3 noch nicht unterstützen und zu früh keine Pläne haben. Die Unterschiede zwischen 2.6 und 3.x sind gering, aber der Unterschied in der Bibliotheksunterstützung ist groß.
quelle
Es gibt mehr als einen Weg, dies zu tun:
Beim Ausführen erzeugt dieser Code:
quelle
Bitte beachten Sie das Python-Shell-Skript, das nacheinander ausgeführt wurde. Hier erhalten Sie die Attribute einer Klasse im durch Komma getrennten Zeichenfolgenformat.
Ich benutze Python 3.4
quelle
a.__dict__.keys()
. Wenn Sie jedoch wissen möchten, ob ein Objekt ein bestimmtes Attribut hat, können Sie es verwendenhasattr
.Zusätzlich zu diesen Antworten werde ich eine Funktion (Python 3) einfügen, mit der praktisch die gesamte Struktur eines beliebigen Werts ausgespuckt werden kann. Es wird verwendet
dir
, um die vollständige Liste der Eigenschaftsnamen zu erstellen, und wird danngetattr
mit jedem Namen verwendet. Es zeigt den Typ jedes Mitglieds des Werts an und wenn möglich auch das gesamte Mitglied:Nun sollte eine der folgenden Aussagen einen Einblick geben:
quelle
Attribute eines Objekts abrufen
Ausgabe
quelle
Wie vor der Verwendung geschrieben,
obj.__dict__
können häufige Fälle behandelt werden, aber einige Klassen verfügen nicht über das__dict__
Attribut und die Verwendung__slots__
(hauptsächlich aus Gründen der Speichereffizienz).Beispiel für eine belastbarere Vorgehensweise:
Die Ausgabe dieses Codes:
Hinweis 1:
Python ist eine dynamische Sprache und es ist immer besser, die Klassen zu kennen, aus denen Sie die Attribute abrufen möchten, da selbst dieser Code in einigen Fällen fehlen kann.
Hinweis 2:
Dieser Code gibt nur Instanzvariablen aus, dh Klassenvariablen werden nicht bereitgestellt. zum Beispiel:
Code-Ausgaben:
Dieser Code druckt das
url
Klassenattribut nicht und lässt möglicherweise die gewünschten Klassenattribute aus.Manchmal denken wir vielleicht, dass ein Attribut ein Instanzmitglied ist, aber es wird in diesem Beispiel nicht angezeigt und wird auch nicht angezeigt.
quelle
__dict__
und haben__slots__
, also möchten Sie wahrscheinlich beides versuchen und nicht nur das Diktat.__dict__
odervars
funktioniert nicht, weil es fehlt__slots__
.__dict__
und__slots__
funktioniert nicht, weil es fehlt__slots__
Basisklassen .dir
funktioniert nicht da sie Klassenattribute wie Methoden oder Eigenschaften sowie die Objektattribute enthält.vars
ist gleichbedeutend mit Verwenden__dict__
.Das ist das Beste, was ich habe:
quelle
quelle
Weitere Informationen finden Sie in der folgenden Python-Shell-Skriptausführung nacheinander. Sie bietet die Lösung von der Erstellung der Klasse bis zum Extrahieren der Feldnamen von Instanzen.
quelle
__attr__
gibt die Liste der Attribute einer Instanz an.quelle
__attr__
in die Beschreibung, verwenden sie aber__attrs__
im Code. Beides hat bei mir nicht funktioniert (werkzeug.datastructures.FileStorage)