In Python, come faccio a trasmettere un oggetto di classe a un dict

| | | | | | |

Diciamo che ho una semplice classe 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 = versione def __int__(self): return self.sum + 9000 def __what_goes_here__(self): return {"a" : self.a, "b": self.b, "c": self.c} 

Posso lanciarlo su un numero intero molto facilmente

>>> w = Wharrgarbl("uno", "due", "tre", 6) >>> int(w) 9006 

Che è fantastico! Ma ora voglio inserirlo in un dict in modo simile

>>> w = Wharrgarbl("uno", "due", "tre", 6) >>> dict(w) {"a": "uno", "c": "tre", "b": "due"} 

Cosa devo definire perché funzioni ? Ho provato a sostituire __dict__ e dict con __what_goes_here__, ma dict(w) ha prodotto un TypeError : l'oggetto Wharrgarbl non è iterabile in entrambi i casi. Non credo che semplicemente rendere la classe iterabile risolverà il problema. Ho anche provato molti google con tutte le diverse formulazioni di "oggetto python cast da dettare" quante ne potevo pensare, ma non sono riuscito a "trovare nulla di rilevante :{

Inoltre! Nota come chiamare w.__dict__ "non farà quello che voglio perché" conterrà w.version e w.sum. Voglio personalizzare il cast su dict nello stesso modo in cui posso personalizzare il cast su int usando def int(self).

So che potrei fare qualcosa del genere

>>> w.__what_goes_here__() {"a": "uno", "c": "tre", "b": "due"} 

Ma suppongo che ci sia un modo pitone per far funzionare dict(w) poiché è lo stesso tipo di cose di int(w) o str(w). Se non c'è un modo più python, va bene anche quello, ho appena pensato che avrei chiesto. Oh! Immagino che dal momento che è importante, questo è per Python 2.7, ma anche punti super bonus per una soluzione 2.4 vecchia e sballata.

C'è un'altra domanda Sovraccarico __dict__() sulla classe python è simile a questo ma potrebbe essere abbastanza diverso da garantire che questo non sia un duplicato.Credo che OP stia chiedendo come eseguire il cast di tutti i dati nei suoi oggetti di classe come dizionari.Sto cercando un approccio più personalizzato in quanto io non voglio che tutto in __dict__ sia incluso nel dizionario restituito da dict(). Qualcosa come variabili pubbliche o private potrebbe essere sufficiente per spiegare cosa sto cercando. Gli oggetti memorizzeranno alcuni valori utilizzati nei calcoli e tali che non ho bisogno/voglio apparire nei dizionari risultanti.

AGGIORNAMENTO: ho scelto di utilizzare asdict< /codice> percorso suggerito ma è stata una scelta difficile selezionare quella che volevo essere la risposta alla domanda. Sia @RickTeachey che @jpmc26 hanno fornito la risposta con cui ho intenzione di rotolare, ma il primo aveva più informazioni e opzioni e ha ottenuto lo stesso risultato ed è stato votato di più, quindi sono andato con esso. aiuto. Sono stato in agguato a lungo e duramente su StackOverflow e sto cercando di far entrare di più le dita dei piedi nell'acqua.