Скажем, у меня есть простой класс в 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}
Я могу легко применить его к целому числу
>>> w = Wharrgarbl('one', 'two', 'three', 6)
>>> int(w)
9006
Это здорово! Но, теперь я хочу передать его в dict таким же образом
>>> w = Wharrgarbl('one', 'two', 'three', 6)
>>> dict(w)
{'a': 'one', 'c': 'three', 'b': 'two'}
Что мне нужно для определения этого? Я попытался заменить оба __dict__
и dict
на __what_goes_here__
, но dict(w)
привел к TypeError: Wharrgarbl object is not iterable
в обоих случаях. Я не думаю, что просто сделать класс итерабельным решит проблему. Я также пытался много googles с таким количеством различных формулировок "python cast object to dict", как я мог подумать, но не смог найти ничего значимого: {
Также! Обратите внимание, что вызов w.__dict__
не будет делать то, что я хочу, потому что он будет содержать w.version
и w.sum
. Я хочу настроить трансляцию на dict
так же, как я могу настроить трансляцию на int
с помощью def int(self)
.
Я знаю, что могу просто сделать что-то вроде этого
>>> w.__what_goes_here__()
{'a': 'one', 'c': 'three', 'b': 'two'}
Но я предполагаю, что существует pythonic способ сделать работу dict(w)
, так как это тот же тип вещи, что и int(w)
или str(w)
. Если нет более питонического пути, это тоже прекрасно, просто подумал, что я спрошу. Ой! Думаю, поскольку это имеет значение, это для python 2.7, но супер бонусные баллы для 2.4 старого и разоренного решения.
Существует еще один вопрос Перегрузка __dict __() в классе python, который похож на этот, но может быть достаточно разным, чтобы гарантировать, что это не дубликат. Я считаю, что OP спрашивает, как отбрасывать все данные в своих объектах класса как словари. Я ищу более индивидуальный подход, потому что я не хочу, чтобы все в __dict__
включено в словарь, возвращаемый dict()
. Что-то вроде public vs private variables может быть достаточно, чтобы объяснить, что я ищу. Объекты будут хранить некоторые значения, используемые в вычислениях, и поэтому мне не нужно/не нужно появляться в результирующих словарях.
UPDATE:
Я решил пойти с предложенным маршрутом asdict
, но это был жесткий выбор, выбрав то, что я хотел быть ответом на вопрос. Оба @RickTeachey и @jpmc26 предоставили ответ, который я собираюсь перевернуть, но у первого было больше информации и вариантов, и он приземлился на тот же результат, а также был увеличен, поэтому я пошел с ним. Охватывает все вокруг и благодарю за помощь. Я притаился долго и упорно на StackOverflow, и я стараюсь, чтобы мои ноги в воде больше.