В python, как мне привести объект класса к dict

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

Допустим, у меня есть простой класс в 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 = версия def __int__(self): return self.sum + 9000 def __what_goes_here__(self): return {"a" : self.a, "b": self.b, "c": self.c} 

Я могу очень легко привести его к целому числу

>>> w = Wharrgarbl("один", "два", "три", 6) >>> int(w) 9006 

Отлично! Но теперь я хочу передать его в диктовку аналогичным образом

>>> w = Wharrgarbl("один", "два", "три", 6) >>> dict(w) {"a": "один", "c": "три", "b": "два"} 

Что мне нужно определить, чтобы это работало ? Я попытался заменить __dict__ и dict на __what_goes_here__, но dict(w) привел к TypeError : объект Wharrgarbl не является итерируемым в обоих случаях. Я не думаю, что простое создание итерируемого класса решит проблему. Я также пытался использовать множество Google с таким количеством различных формулировок «объект python cast to dict», как я мог придумать, но не смог найти ничего подходящего: {

Также! Обратите внимание, что вызов w.__dict__ не будет делать то, что я хочу, потому что он будет содержать w.version и w.sum. Я хочу настроить приведение к dict таким же образом, как я могу настроить приведение к int с помощью def int(self).

Я знаю, что мог бы сделать что-то подобное

>>> w.__what_goes_here__() {"a": "один", "c": "три", "b": "два"} 

Но я предполагаю, что есть питонический способ чтобы dict(w) работал, поскольку это тот же тип, что и int(w) или str(w). Если нет более питонического способа, это тоже хорошо, просто подумал, что я спрошу. О! Я думаю, поскольку это имеет значение, это для Python 2.7, но также супер бонусные баллы за старое и сломанное решение 2.4.

Есть еще один вопрос Перегрузка __dict__() в классе python который похож на этот, но может достаточно отличаться, чтобы гарантировать, что это не дубликат. Я считаю, что OP спрашивает, как преобразовать все данные в его объектах класса в словари. Я ищу более индивидуальный подход в том, что я не хочу, чтобы все в __dict__ включалось в словарь, возвращаемый dict(). Что-то вроде общедоступных и частных переменных может быть достаточным, чтобы объяснить, что я ищу. Объекты будут хранить некоторые значения, используемые в вычислениях, и такие, которые мне не нужно/не хочется отображать в результирующих словарях.

ОБНОВЛЕНИЕ: я решил использовать asdict< Маршрут /code> был предложен, но это был трудный выбор, чтобы выбрать то, что я хотел бы быть ответом на вопрос. И @RickTeachey, и @jpmc26 предоставили ответ, с которым я собираюсь согласиться, но у первого было больше информации и вариантов, и он также получил тот же результат, и за него проголосовали больше, поэтому я согласился. помогите. Я долго и упорно скрывался в stackoverflow и пытаюсь больше погрузиться в воду.