En python, comment convertir un objet de classe en dict

| | | | | | |

Disons que j'ai une classe simple en 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} 

Je peux le convertir en entier très facilement

>>> w = Wharrgarbl("un", "deux", "trois", 6) >>> int(w) 9006 

C'est super ! Mais, maintenant, je veux le convertir en dict de la même manière

>>> w = Wharrgarbl("un", "deux", "trois", 6) >>> dict(w) {"a": "un", "c": "trois", "b": "deux"} 

Que dois-je définir pour que cela fonctionne ? J'ai essayé de remplacer à la fois __dict__ et dict par __what_goes_here__, mais dict(w) a entraîné une TypeError : L'objet Wharrgarbl n'est pas itérable dans les deux cas. Je ne pense pas que le simple fait de rendre la classe itérable résoudra le problème. J'ai également essayé de nombreux googles avec autant de formulations différentes de "python cast object to dict" que je pouvais penser mais je n'ai rien trouvé de pertinent :{

Aussi ! Remarquez comment appeler w.__dict__ ne fera pas ce que je veux car il contiendra w.version et w.sum. Je souhaite personnaliser la distribution en dict de la même manière que je peux personnaliser la distribution en int en utilisant def int(self).

Je sais que je pourrais faire quelque chose comme ça

>>> w.__what_goes_here__() {"a": "un", "c": "trois", "b": "deux"} 

Mais je suppose qu'il existe une méthode pythonique pour faire fonctionner dict(w) puisque c'est le même type de chose que int(w) ou str(w). S'il n'y a pas plus de méthode pythonique, c'est bien aussi, je me suis dit que je demanderais. Oh! Je suppose que puisque c'est important, c'est pour python 2.7, mais des points super bonus pour une solution 2.4 ancienne et cassée aussi.

Il y a une autre question Surcharger __dict__() sur la classe python qui est similaire à celui-ci mais peut être suffisamment différent pour justifier qu'il ne s'agisse pas d'un doublon. Je crois que OP demande comment convertir toutes les données de ses objets de classe en dictionnaires. Je recherche une approche plus personnalisée dans la mesure où je ne voulez pas que tout ce qui se trouve dans __dict__ soit inclus dans le dictionnaire renvoyé par dict(). Quelque chose comme des variables publiques ou privées peut suffire à expliquer ce que je recherche. Les objets stockeront certaines valeurs utilisées dans les calculs et telles que je n"ai pas besoin/veux apparaître dans les dictionnaires résultants.

MISE À JOUR : J"ai choisi d"aller avec le asdict itinéraire suggéré mais c'était un choix difficile en sélectionnant ce que je voulais être la réponse à la question. @RickTeachey et @ jpmc26 ont tous deux fourni la réponse avec laquelle je vais rouler, mais le premier avait plus d'informations et d'options et a également atterri sur le même résultat et a été davantage voté, alors je suis allé avec. aide. J"ai longtemps et durement guetté sur stackoverflow et j"essaie de mettre davantage mes orteils dans l"eau.