Допустим, у меня есть простой класс в 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 и пытаюсь больше погрузиться в воду.