Em python, como faço para lançar um objeto de classe para um dict

| | | | | | |

Digamos que eu tenha uma classe simples em 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 = versão def __int__(self): return self.sum + 9000 def __what_goes_here__(self): return {"a" : self.a, "b": self.b, "c": self.c} 

Posso convertê-lo para um inteiro muito facilmente

>>> w = Wharrgarbl("um", "dois", "três", 6) >>> int(w) 9006 

O que é ótimo! Mas, agora quero convertê-lo em um dict de maneira semelhante

>>> w = Wharrgarbl("um", "dois", "três", 6) >>> dict(w) {"a": "um", "c": "três", "b": "dois"} 

O que eu preciso definir para que isso funcione ? Tentei substituir __dict__ e dict por __what_goes_here__, mas dict(w) resultou em um TypeError : O objeto Wharrgarbl não é iterável em ambos os casos. Eu não acho que simplesmente tornar a classe iterável resolverá o problema. Eu também tentei muitos googles com tantas palavras diferentes de "python cast object to dict" quanto eu poderia pensar, mas não consegui encontrar nada relevante:{

Também! Observe como chamar w.__dict__ não fará o que eu quero porque vai conter w.version e w.sum. Desejo personalizar a conversão para dict da mesma forma que posso personalizar a conversão para int usando def int(self).

Sei que poderia fazer algo assim

>>> w.__what_goes_here__() {"a": "um", "c": "três", "b": "dois"} 

Mas estou assumindo que existe uma maneira pythonic para fazer dict(w) funcionar, pois é o mesmo tipo de coisa que int(w) ou str(w). Se não houver uma maneira mais pythonic, tudo bem também, imaginei que eu perguntaria. Oh! Eu acho que já que isso importa, isso é para o python 2.7, mas super pontos de bônus para uma solução 2.4 antiga e quebrada também.

Há outra pergunta Sobrecarregando __dict__() na classe python que é semelhante a este, mas pode ser diferente o suficiente para garantir que não seja uma duplicata. Acredito que o OP esteja perguntando como converter todos os dados em seus objetos de classe como dicionários. Estou procurando uma abordagem mais personalizada na medida em que não quero tudo em __dict__ incluído no dicionário retornado por dict(). Algo como variáveis públicas vs privadas pode ser suficiente para explicar o que estou procurando. Os objetos estarão armazenando alguns valores usados em cálculos e de tal forma que eu não preciso/quero aparecer nos dicionários resultantes.

UPDATE: Eu escolhi usar o asdict rota sugerida, mas foi uma escolha difícil selecionar o que eu queria que fosse a resposta para a pergunta. Ambos @RickTeachey e @jpmc26 forneceram a resposta com a qual eu vou rolar, mas o primeiro tinha mais informações e opções e também obteve o mesmo resultado e foi mais votado, então eu fui com ele. Eu espreitei por muito tempo no stackoverflow e estou tentando colocar mais os dedos dos pés na água.