Beachten Sie, dass die beste Vorgehensweise in Python 2.7 darin besteht, Klassen neuen Stils zu verwenden (die in Python 3 nicht benötigt werden), d. H.
class Foo(object):
...
Es gibt auch einen Unterschied zwischen einem 'Objekt' und einer 'Klasse'. Um ein Wörterbuch aus einem beliebigen Objekt zu erstellen , ist es ausreichend, es zu verwenden __dict__
. Normalerweise deklarieren Sie Ihre Methoden auf Klassenebene und Ihre Attribute auf Instanzebene. Dies __dict__
sollte in Ordnung sein. Zum Beispiel:
>>> class A(object):
... def __init__(self):
... self.b = 1
... self.c = 2
... def do_nothing(self):
... pass
...
>>> a = A()
>>> a.__dict__
{'c': 2, 'b': 1}
Ein besserer Ansatz (von Robert in Kommentaren vorgeschlagen) ist die eingebaute vars
Funktion:
>>> vars(a)
{'c': 2, 'b': 1}
Je nachdem, was Sie tun möchten, kann es auch hilfreich sein, von zu erben dict
. Dann ist Ihre Klasse bereits ein Wörterbuch, und wenn Sie möchten, können Sie das Diktat überschreiben getattr
und / oder setattr
durchrufen und festlegen. Zum Beispiel:
class Foo(dict):
def __init__(self):
pass
def __getattr__(self, attr):
return self[attr]
# etc...
__dict__
funktioniert nicht, wenn das Objekt Slots verwendet (oder in einem C-Modul definiert ist).vars(a)
tun? Für mich ist es vorzuziehen, das__dict__
direkt aufzurufen .__getattr__ = dict.__getitem__
das Verhalten genau zu replizieren,__setattr__ = dict.__setitem__
als__delattr__ = dict.__delitem__
für die Vollständigkeit.Stattdessen
x.__dict__
ist es tatsächlich pythonischer zu verwendenvars(x)
.quelle
MyClass(**my_dict)
, vorausgesetzt, Sie haben einen Konstruktor mit Parametern definiert, die die Klassenattribute widerspiegeln. Sie müssen nicht auf private Attribute zugreifen oder Diktate überschreiben.vars
Funktion überschreiben und zusätzliche Funktionen einführen, ohne das Objekt selbst zu ändern.__slots__
.vars
, dh ein Äquivalent von__dict__
für "geschlitzte" Klassen zurückzugeben. Derzeit kann es durch Hinzufügen einer zurückgegebenen__dict__
Eigenschaft emuliert werden{x: getattr(self, x) for x in self.__slots__}
(nicht sicher, ob dies die Leistung oder das Verhalten in irgendeiner Weise beeinflusst).Die
dir
eingebaute gibt Ihnen alle Objektattribute, einschließlich speziellen Methoden wie__str__
,__dict__
und eine ganze Reihe von anderen , die Sie wahrscheinlich nicht wollen. Aber Sie können so etwas tun wie:Sie können dies also erweitern, um nur Datenattribute und keine Methoden zurückzugeben, indem Sie Ihre
props
Funktion folgendermaßen definieren :quelle
ismethod
fängt keine Funktionen ab. Beispiel :inspect.ismethod(str.upper)
.inspect.isfunction
ist jedoch nicht viel hilfreicher. Ich bin mir nicht sicher, wie ich das sofort angehen soll.Ich habe mich mit einer Kombination aus beiden Antworten zufrieden gegeben:
quelle
staticmethod
? Es ist nichtcallable
.Ich dachte, ich würde einige Zeit brauchen, um Ihnen zu zeigen, wie Sie ein Objekt übersetzen können, über das Sie diktieren möchten
dict(obj)
.Der Schlüsselabschnitt dieses Codes ist die
__iter__
Funktion.Wie die Kommentare erklären, greifen wir zuerst die Klassenelemente zu und verhindern alles, was mit '__' beginnt.
Sobald Sie das erstellt haben,
dict
können Sie dieupdate
Diktierfunktion verwenden und die Instanz übergeben__dict__
.Diese geben Ihnen ein vollständiges Klassen- + Instanzwörterbuch der Mitglieder. Jetzt müssen sie nur noch durchlaufen und die Renditen erzielen.
Wenn Sie dies häufig verwenden möchten, können Sie auch einen
@iterable
Klassendekorateur erstellen .quelle
dict((x, y) for x, y in KpiRow.__dict__.items() if x[:2] != '__' and not callable(y))
wird es gelöst? Aber es könnte immer nochstatic
Methoden geben :(Dabei fehlen Attribute, die das Objekt von seiner Klasse erbt. Zum Beispiel,
hasattr (a, 'x') ist wahr, aber 'x' erscheint nicht in einem .__ dict__
quelle
vars()
funktioniert nichtdir
ist in diesem Fall die Lösung. Siehe die andere Antwort dazu.Späte Antwort, aber zur Vollständigkeit und zum Nutzen der Googler vorgesehen:
Hier werden keine in der Klasse definierten Methoden angezeigt, aber es werden weiterhin Felder angezeigt, einschließlich der Lambdas zugewiesenen oder derjenigen, die mit einem doppelten Unterstrich beginnen.
quelle
Ich denke, der einfachste Weg ist, ein getitem- Attribut für die Klasse zu erstellen . Wenn Sie in das Objekt schreiben müssen, können Sie ein benutzerdefiniertes Setattr erstellen . Hier ist ein Beispiel für getitem :
dict generiert die Objektattribute in einem Wörterbuch und das Wörterbuchobjekt kann verwendet werden, um das gewünschte Element abzurufen.
quelle
Ein Nachteil der Verwendung
__dict__
ist, dass es flach ist; Es werden keine Unterklassen in Wörterbücher konvertiert.Wenn Sie Python3.5 oder höher verwenden, können Sie Folgendes verwenden
jsons
:quelle
Wenn Sie einen Teil Ihrer Attribute auflisten möchten, überschreiben Sie
__dict__
:Dies ist sehr hilfreich, wenn Sie
instance
großed
Blockdaten erhalten und wie eine Nachrichtenwarteschlange an Redis senden möchten .quelle
__dict__
ist ein Attribut, keine Methode, daher ändert dieses Beispiel die Schnittstelle (dh Sie müssen sie als aufrufbar aufrufen), sodass sie nicht überschrieben wird.PYTHON 3:
Jetzt können Sie den obigen Code in Ihrer eigenen Klasse verwenden:
quelle
vars()
ist großartig, funktioniert aber nicht für verschachtelte Objekte von ObjektenKonvertieren Sie verschachtelte Objekte von Objekten in Diktate:
quelle