В 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 = 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 

Это здорово! Но теперь я хочу, чтобы это было похоже на диктофон

 >>> 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 в обоих случаях TypeError: Wharrgarbl object is not iterable . Я не думаю, что просто сделать класс итерабельным решит проблему. Я также пытался много googles с таким количеством разных формулировок «объекта python cast to dict», о котором я мог думать, но не смог найти ничего важного: {

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

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

 >>> w.__what_goes_here__() {'a': 'one', 'c': 'three', 'b': 'two'} 

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

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

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

4 Solutions collect form web for “В python, как мне применить объект класса к dict”

Вам нужно переопределить ' __iter__' .

Например, например:

 def __iter__(self): yield 'a', self.a yield 'b', self.b yield 'c', self.c 

Теперь вы можете просто сделать:

 dict(my_object) 

Я также предложил бы изучить модуль 'collections.abc ». Этот ответ может быть полезен:

https://stackoverflow.com/a/27803404/2437514

В частности, вы захотите посмотреть объекты 'Mapping' и 'MutableMapping' . Если вы используете этот модуль и наследуете свой объект от одного из dict like abcs, вы можете наложить свой объект на dict так, как вам нужно.

Как отмечалось в комментариях ниже: стоит упомянуть, что, делая это, метод abc по существу превращает ваш класс объектов в класс, подобный dict . Итак, все, что вы могли бы сделать с dict , вы могли бы сделать со своим собственным объектом класса. Это может быть или не может быть желательным. Это также означало бы, что, вероятно, будет мало оснований (из-за утиной печати), чтобы в первую очередь привести ваш объект к dict .

Также рассмотрим возможность просмотра числовых символов в модуле numbers :

https://docs.python.org/3/library/numbers.html

Так как вы также бросаете свой объект в int , возможно, имеет смысл существенно превратить ваш класс в полноценный int чтобы кастинг не был необходим.

Однако, подумав об этом немного больше, я бы очень рассмотрел способ asdict решений, предложенный другими ответами. Не похоже, что ваш объект действительно является частью коллекции. Использование метода iter или abc может сбивать с толку для других, если только не очень очевидно, какие именно члены объекта будут и не будут повторяться.

Нет волшебного метода, который будет делать то, что вы хотите. Ответ просто назовите его соответствующим образом. asdict – разумный выбор для простого преобразования в dict , основанного в основном на namedtuple . Тем не менее, ваш метод, очевидно, содержит специальную логику, которая не может быть сразу очевидна из этого имени; вы возвращаете только подмножество состояния класса. Если вы можете придумать несколько более подробное имя, которое ясно и ясно объясняет концепции, тем лучше.

Другие ответы предполагают использование __iter__ , но если ваш объект действительно итерабелен (представляет собой ряд элементов), это действительно мало смысла и представляет собой неудобное злоупотребление этим методом. Тот факт, что вы хотите отфильтровать некоторые из состояний класса, делает этот подход еще более сомнительным.

что-то вроде этого, вероятно, будет работать

 class MyClass: def __init__(self,x,y,z): self.x = x self.y = y self.z = z def __iter__(self): #overridding this to return tuples of (key,value) return iter([('x',self.x),('y',self.y),('z',self.z)]) dict(MyClass(5,6,7)) # because dict knows how to deal with tuples of (key,value) 

Думаю, это сработает для вас.

 class A(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 __iter__(self): return self.__dict__.iteritems() a = A(1,2,3,4,5) print dict(a) 

Вывод

{'a': 1, 'c': 3, 'b': 2, 'sum': 6, 'version': 5}

  • Собственный бесконечный диапазон?
  • Как добавить соответствующие элементы из нескольких списков чисел?
  • Какое простейшее приложение для сокращения URL-адресов можно написать в python для Google App Engine?
  • Python, создание объектов
  • Python записывает файл без перезаписывания текущего txt
  • Удаление символов \ u2018 и \ u2019
  • если возвращаемое значение для метода `__enter__` всегда будет` self` в python
  • Потребление конечных точек GAE с помощью клиента Python
  • Python - лучший язык программирования в мире.