Hoe kan ik in python een klasseobject naar een dictaat casten?

| | | | | | |

Laten we zeggen dat ik een eenvoudige klasse in python heb

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} 

Ik kan het heel gemakkelijk naar een geheel getal casten

>>> w = Wharrgarbl("een", "twee", "drie", 6) >>> int(w) 9006 

Wat geweldig is! Maar nu wil ik het op een gelijkaardige manier in een dictaat gieten

>>> w = Wharrgarbl("een", "twee", "drie", 6) >>> dict(w) {"a": "one", "c": "three", "b": "two"} 

Wat moet ik definiëren om dit te laten werken ? Ik heb geprobeerd om __dict__ en dict te vervangen door __what_goes_here__, maar dict(w) resulteerde in een TypeError : Wharrgarbl-object is in beide gevallen niet itereerbaar. Ik denk niet dat het probleem eenvoudigweg kan worden opgelost door de klasse itereerbaar te maken. Ik heb ook veel Googles geprobeerd met zoveel verschillende bewoordingen van "python cast object to dict" als ik kon bedenken, maar ik kon niets relevants vinden:{

Ook! Merk op hoe het aanroepen van w.__dict__ niet doet wat ik wil, omdat het w.version en w.sum zal bevatten. Ik wil de cast aanpassen aan dict op dezelfde manier als ik de cast kan aanpassen aan int door def int(self) te gebruiken.

Ik weet dat ik zoiets zou kunnen doen

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

Maar ik neem aan dat er een pythonische manier is om dict(w) te laten werken aangezien het hetzelfde type ding is als int(w) of str(w). Als er "een meer pythonische manier" is, is dat ook goed, ik dacht dat ik het zou vragen. Oh! Ik denk dat, aangezien het er toe doet, dit voor Python 2.7 is, maar ook superbonuspunten voor een 2.4 oude en kapotte oplossing.

Er is nog een vraag Overbelasting van __dict__() op python class dat is vergelijkbaar met deze, maar kan anders genoeg zijn om te rechtvaardigen dat dit geen duplicaat is. Ik geloof dat OP vraagt hoe alle gegevens in zijn klasseobjecten als woordenboeken moeten worden gegoten. Ik ben op zoek naar een meer aangepaste benadering in die zin dat ik wil niet dat alles in __dict__ wordt opgenomen in het woordenboek dat wordt geretourneerd door dict(). Iets als openbare versus privévariabelen kan voldoende zijn om uit te leggen wat ik zoek. De objecten zullen enkele waarden opslaan die in berekeningen worden gebruikt en zodanig dat ik niet in de resulterende woordenboeken hoef/wil verschijnen.

UPDATE: ik heb ervoor gekozen om met de asdict< te gaan /code> route voorgesteld, maar het was een moeilijke keuze om te selecteren wat ik het antwoord op de vraag wilde zijn. Zowel @RickTeachey als @jpmc26 gaven het antwoord waar ik mee aan de slag ga, maar de eerste had meer info en opties en kwam ook op hetzelfde resultaat uit en kreeg meer upvotes, dus ik ging ermee akkoord. Upvotes overal en bedankt voor de help. Ik heb lang en hard op stackoverflow op de loer gelegen en ik probeer mijn tenen meer in het water te krijgen.