Gibt es in Python eine integrierte Methode, um ein Array aller Instanzvariablen einer Klasse abzurufen? Zum Beispiel, wenn ich diesen Code habe:
class hi:
def __init__(self):
self.ii = "foo"
self.kk = "bar"
Gibt es eine Möglichkeit für mich, dies zu tun:
>>> mystery_method(hi)
["ii", "kk"]
Bearbeiten: Ich hatte ursprünglich fälschlicherweise nach Klassenvariablen gefragt.
python
methods
instance-variables
Chris Bunch
quelle
quelle
Antworten:
Jedes Objekt enthält eine
__dict__
Variable, die alle Variablen und ihre Werte enthält.Versuche dies
quelle
Verwenden Sie vars ()
quelle
__method
ist privat,__method__
ist eine spezielle Methode, nicht unbedingt privat; Ich möchte sagen, dass die speziellen Methoden eher die Fähigkeiten eines Objekts als Methoden definieren.__method__
ist ziemlich hässlich, und ich denke, sie wurden so benannt, um die Leute davon abzuhalten, sie zu benutzen, es sei denn, dies ist absolut notwendig. In diesem Fall haben wir die Alternative vars ().__str__
,__method__
ist für die Sprache selbst normal. Was passiert wenn dustr(something)
?Normalerweise können Sie Instanzattribute nicht nur für eine Klasse erhalten, zumindest nicht, ohne die Klasse zu instanziieren. Sie können jedoch Instanzattribute für eine Instanz oder Klassenattribute für eine Klasse abrufen. Siehe das 'Inspect'-Modul. Sie können keine Liste der Instanzattribute abrufen, da Instanzen wirklich alles als Attribut haben können. Wie in Ihrem Beispiel besteht die normale Methode zum Erstellen darin, sie einfach mit der Methode __init__ zuzuweisen.
Eine Ausnahme ist, wenn Ihre Klasse Slots verwendet. Hierbei handelt es sich um eine feste Liste von Attributen, die die Klasse für Instanzen zulässt. Slots werden unter http://www.python.org/2.2.3/descrintro.html erläutert , es gibt jedoch verschiedene Fallstricke bei Slots. Sie wirken sich auf das Speicherlayout aus, sodass Mehrfachvererbung problematisch sein kann und die Vererbung im Allgemeinen auch Slots berücksichtigen muss.
quelle
Sowohl die Vars () - als auch die dict-Methode funktionieren für das Beispiel, das das OP veröffentlicht hat, aber sie funktionieren nicht für "lose" definierte Objekte wie:
Um alle nicht aufrufbaren Attribute zu drucken, können Sie die folgende Funktion verwenden:
quelle
exec('print object.%s\n\n') % i
sollte geschrieben werden alsprint getattr(object, i)
Sie können auch testen, ob ein Objekt eine bestimmte Variable hat:
quelle
Ihr Beispiel zeigt "Instanzvariablen", nicht wirklich Klassenvariablen.
Suchen Sie
hi_obj.__class__.__dict__.items()
nach den Klassenvariablen zusammen mit anderen Klassenmitgliedern wie Elementfunktionen und dem enthaltenen Modul.Klassenvariablen werden von allen Instanzen der Klasse gemeinsam genutzt.
quelle
Vorschlagen
Mit anderen Worten, es wird im Wesentlichen nur __dict__ umbrochen
quelle
Obwohl dies keine direkte Antwort auf die OP-Frage ist, gibt es eine ziemlich gute Möglichkeit, herauszufinden, welche Variablen in einer Funktion enthalten sind. Schauen Sie sich diesen Code an:
Das Attribut func_code enthält alle möglichen interessanten Dinge. Es erlaubt dir, ein paar coole Sachen zu machen. Hier ist ein Beispiel, wie ich dies verwendet habe:
quelle
Aufbauend auf der Antwort von dmark, um Folgendes zu erhalten. Dies ist nützlich, wenn Sie das Äquivalent von sprintf möchten und hoffentlich jemandem helfen möchten ...
quelle
Manchmal möchten Sie die Liste basierend auf öffentlichen / privaten Variablen filtern. Z.B
quelle