En Python, ¿cómo puedo convertir un objeto de clase en un dictado?

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

Digamos que tengo una clase simple en python

class Wharrgarbl(objeto): def __init__(self, a, b, c, sum, version="old" ): self.a = a self.b = b self.c = c self.sum = 6 self.version = versión def __int__(self): return self.sum + 9000 def __what_va_aquí__(self): return {"a" : self.a, "b": self.b, "c": self.c} 

Puedo convertirlo a un número entero muy fácilmente

>>> w = Wharrgarbl("uno", "dos", "tres", 6) >>> int(w) 9006 

¡Qué genial! Pero, ahora quiero convertirlo en un dictado de manera similar

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

¿Qué necesito definir para que esto funcione? ? Intenté sustituir __dict__ y dict por __what_goes_here__, pero dict(w) resultó en un TypeError : El objeto Wharrgarbl no es iterable en ambos casos. No creo que simplemente hacer que la clase sea iterable resuelva el problema. También intenté muchas búsquedas en Google con tantas expresiones diferentes de "Python cast object to dict" como se me ocurrió, pero no pude encontrar nada relevante:{

¡También! Observe cómo llamar a w.__dict__ no hará lo que quiero porque contendrá w.version y w.sum. Quiero personalizar la conversión a dict de la misma manera que puedo personalizar la conversión a int usando def int(self).

Sé que podría hacer algo como esto

>>> w.__what_goes_here__() {"a": "uno", "c": "tres", "b": "dos"} 

Pero asumo que hay una forma pitónica para hacer que dict(w) funcione ya que es el mismo tipo de cosa que int(w) o str(w). Si no hay una forma más pitónica, también está bien, solo pensé en preguntar. ¡Oh! Supongo que, dado que es importante, esto es para python 2.7, pero también puntos extra para una solución 2.4 vieja y rota.

Hay otra pregunta Sobrecargar __dict__() en la clase python que es similar a este pero puede ser lo suficientemente diferente como para garantizar que esto no sea un duplicado. Creo que OP está preguntando cómo convertir todos los datos en sus objetos de clase como diccionarios. Estoy buscando un enfoque más personalizado en el que yo no quiero que todo en __dict__ esté incluido en el diccionario devuelto por dict(). Algo así como variables públicas o privadas puede ser suficiente para explicar lo que estoy buscando. Los objetos almacenarán algunos valores utilizados en los cálculos y no necesito/no quiero que aparezcan en los diccionarios resultantes.

ACTUALIZACIÓN: he elegido ir con el asdict ruta sugerida, pero fue una elección difícil seleccionar lo que quería que fuera la respuesta a la pregunta. Tanto @RickTeachey como @jpmc26 dieron la respuesta que voy a seguir, pero el primero tenía más información y opciones y también obtuvo el mismo resultado y recibió más votos positivos, así que lo seguí. Sin embargo, hubo votos positivos y gracias por el ayuda. Estuve al acecho durante mucho tiempo en stackoverflow y estoy tratando de meter más los dedos de los pies en el agua.