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

Преимущества класса UserDict в Python

Каковы преимущества использования класса UserDict?

Я имею в виду, что я действительно получаю, если вместо

class MyClass(object):
    def __init__(self):
        self.a = 0
        self.b = 0
...
m = MyClass()
m.a = 5
m.b = 7

Я напишу следующее:

class MyClass(UserDict):
    def __init__(self):
        UserDict.__init__(self)
        self["a"] = 0
        self["b"] = 0
...
m = MyClass()
m["a"] = 5
m["b"] = 7

Изменить. Если я правильно понимаю, я могу добавить новые поля в объект во время выполнения в обоих случаях?

m.c = "Cool"

и

m["c"] = "Cool"
4b9b3361

Ответ 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 так удобно (см. этот вопрос, который был закрыт с помощью "не исправить"; стоит прочитать).

Ответ 2

Подклассификация dict дает вам все функции dict, например if x in dict:. Обычно вы это делаете, если хотите расширить функции dict, создав, например, упорядоченный dict.

BTW: В более поздних версиях Python вы можете подклассифицировать dict напрямую, вам не нужно UserDict.