Ответ 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()
распознает и скопирует ключи и значения к новому объекту словаря. Это немного больше работы, но может стоить того, если вы хотите, чтобы ваш пользовательский класс действовал как отображение везде.