Подтвердить что ты не робот

Перегрузка __dict __() в классе python

У меня есть класс, где я хочу вернуть объект в качестве словаря, поэтому я реализовал его в __dict__(). Правильно ли это?

Я понял, как только я это сделал, тогда я мог бы использовать dict (пользовательский объект) и вернуть объект в качестве словаря, но это не работает.

Если вы перегружаете __dict__()? Как вы можете сделать так, чтобы пользовательский объект мог быть преобразован в словарь с помощью dict()?

4b9b3361

Ответ 1

__dict__ не является специальным методом для объектов Python. Он используется для словаря атрибутов; dict() никогда не использует его.

Вместо этого вы можете поддерживать итерацию; когда dict() передается iterable, который генерирует пары ключ-значение, создается новый словарь с этими парами ключ-значение.

Вы можете предоставить итерабельность, внедряя метод __iter__, который должен вернуть iterator. Реализация этого метода как функции генератора достаточно:

class Foo(object):
    def __init__(self, *values):
        self.some_sequence = values

    def __iter__(self):
        for key in self.some_sequence:
            yield (key, 'Value for {}'.format(key))

Демо:

>>> class Foo(object):
...     def __init__(self, *values):
...         self.some_sequence = values
...     def __iter__(self):
...         for key in self.some_sequence:
...             yield (key, 'Value for {}'.format(key))
... 
>>> f = Foo('bar', 'baz', 'eggs', 'ham')
>>> dict(f)
{'baz': 'Value for baz', 'eggs': 'Value for eggs', 'bar': 'Value for bar', 'ham': 'Value for ham'}

Вы также можете подклассом dict или реализовать Сопоставление абстрактного класса, а dict() распознает и скопирует ключи и значения к новому объекту словаря. Это немного больше работы, но может стоить того, если вы хотите, чтобы ваш пользовательский класс действовал как отображение везде.

Ответ 2

Нет. __dict__ - метод, используемый для интроспекции - он возвращает атрибуты объекта. То, что вы хотите, это совершенно новый метод, называйте его as_dict, например, - это соглашение. Дело в том, что объекты dict не обязательно должны быть созданы с помощью конструктора dict.