Ответ 1
UserDict.UserDict
не имеет существенной добавленной стоимости с Python 2.2, так как, как @g упоминает, вы можете теперь подклассом dict
напрямую - - он существует только для обратной совместимости с Python 2.1 и ранее, когда встроенные типы не могут быть подклассами. Тем не менее, он хранился в Python 3 (теперь в нужном месте в модуле collections
), так как теперь документы,
Необходимость этого класса была частично вытеснены способностью подкласс непосредственно из dict; Однако, с этим классом легче работать потому что основной словарь доступный как атрибут.
UserDict.DictMixin
, в Python 2, весьма удобен - как говорят документы,
Модуль определяет mixin, DictMixin, определение всех методов словаря для классы, которые уже имеют минимум отображение интерфейса. Это очень упрощает написание классов, требующих подставляться под словари (например, модуль полки).
Вы подклассифицируете его, определите некоторые фундаментальные методы (по крайней мере __getitem__
), которых достаточно для отображения только для чтения, без возможности получить ключи или итерации, а также keys
, если вам нужны эти способности, возможно __setitem__
, и у вас есть R/W-сопоставление без возможности удаления элементов, добавьте __delitem__
для полной возможности и, возможно, переопределите другие методы по причинам производительности) и получите полноценную реализацию dict
rich API (update
, get
и т.д.). Отличный пример шаблона дизайна Template Method.
В Python 3 отсутствует DictMixin
; вы можете получить почти ту же функциональность, полагаясь вместо collections.MutableMapping
(или просто collections.Mapping
для сопоставлений R/O). Это немного более изящно, хотя и не QUIT так удобно (см. этот вопрос, который был закрыт с помощью "не исправить"; стоит прочитать).