Wie kann ich in Python ein Klassenobjekt in ein Diktat umwandeln?

| | | | | | | | | | | | | | | |

Nehmen wir an, ich habe eine einfache Klasse in Python

class Wharrgarbl(object): def __init__(self, a, b, c, sum, version="old" ): self.a = a self.b = b self.c = c self.sum = 6 self.version = Version def __int__(self): return self.sum + 9000 def __what_goes_here__(self): return {"a" : self.a, "b": self.b, "c": self.c} 

Ich kann es sehr einfach in eine ganze Zahl umwandeln

>>> w = Whargarbl("eins", "zwei", "drei", 6) >>> int(w) 9006 

Das ist großartig! Aber jetzt möchte ich es auf ähnliche Weise in ein Diktat umwandeln

>>> w = Whargarbl("eins", "zwei", "drei", 6) >>> dict(w) {"a": "eins", "c": "drei", "b": "zwei"} 

Was muss ich definieren, damit das funktioniert ? Ich habe versucht, __what_goes_here__ durch __dict__ und dict zu ersetzen, aber dict(w) führte zu einem TypeError : Das Wharrgarbl-Objekt ist in beiden Fällen nicht iterierbar. Ich glaube nicht, dass es das Problem lösen wird, die Klasse einfach iterierbar zu machen. Ich habe auch viele Googles mit so vielen verschiedenen Formulierungen von "python cast object to dict" versucht, wie ich mir vorstellen konnte, konnte aber nichts Relevantes finden: {

Auch! Beachten Sie, dass der Aufruf von w.__dict__ nicht das tut, was ich will, weil es w.version und w.sum enthalten wird. Ich möchte die Umwandlung in dict auf die gleiche Weise anpassen, wie ich die Umwandlung in int anpassen kann, indem ich def int(self) verwende.

Ich weiß, dass ich so etwas einfach machen könnte

>>> w.__what_goes_here__() {"a": "one", "c": "three", "b": "two"} 

Aber ich gehe davon aus, dass es einen Python-Weg gibt um dict(w) zum Laufen zu bringen, da es dasselbe ist wie int(w) oder str(w). Wenn es keinen pythonischeren Weg gibt, ist das auch in Ordnung, ich dachte nur, ich würde fragen. Oh! Ich denke, da es darauf ankommt, ist dies für Python 2.7, aber auch super Bonuspunkte für eine 2.4 alte und kaputte Lösung.

Es gibt eine weitere Frage Überladen von __dict__() in der Python-Klasse das ist diesem ähnlich, kann aber unterschiedlich genug sein, um zu garantieren, dass dies kein Duplikat ist. Ich glaube, dass OP fragt, wie alle Daten in seinen Klassenobjekten als Wörterbücher umgewandelt werden sollen. Ich suche nach einem individuelleren Ansatz, in dem ich Ich möchte nicht, dass alles in __dict__ im Wörterbuch enthalten ist, das von dict() zurückgegeben wird. So etwas wie öffentliche vs. private Variablen kann ausreichen, um zu erklären, wonach ich suche. Die Objekte werden einige Werte speichern, die in Berechnungen verwendet werden, und solche, die ich nicht in den resultierenden Wörterbüchern auftauchen muss/möchte.

UPDATE: Ich habe mich für den asdict< entschieden /code> Route vorgeschlagen, aber es war eine schwierige Entscheidung, auszuwählen, was ich als Antwort auf die Frage haben wollte. Sowohl @RickTeachey als auch @jpmc26 lieferten die Antwort, mit der ich rollen werde, aber erstere hatte mehr Informationen und Optionen und landete auch auf dem gleichen Ergebnis und wurde mehr positiv bewertet, also habe ich mich dafür entschieden. Upvotes rundherum und danke für die Hilfe. Ich habe lange und hart auf Stackoverflow gelauert und versuche, meine Zehen mehr ins Wasser zu bekommen.