Ответ 1
Если вы хотите, чтобы пользовательская коллекция фактически хранила данные, подкласс dict. Это особенно полезно, если вы хотите расширить интерфейс (например, добавить методы).
Ни один из встроенных методов не вызовет ваш пользовательский __getitem__
/__setitem__
. Если вам нужен полный контроль над ними, создайте собственный класс, который вместо этого будет использовать абстрактный базовый класс collections.MutableMapping
.
ABC не предоставляет средства для хранения фактических данных, а только для интерфейса с реализациями по умолчанию для некоторых методов. Однако эти реализации по умолчанию будут вызывать ваши пользовательские __getitem__
и __setitem__
. Вам нужно будет использовать внутренний dict
для хранения данных и реализовать все абстрактные методы: __len__
, __iter__
, __getitem__
, __setitem__
и __delitem__
.
Класс UserDict
из модуля collections
(в Python 2, модуль также называется UserDict
) - это оболочка вокруг внутреннего dict
, реализующая MutableMapping
ABC. Если вы хотите настроить поведение dict
, эта реализация может быть отправной точкой.
Вкратце:
- MutableMapping определяет интерфейс. Подкласс, чтобы создать что-то, что действует как
dict
. Это полностью зависит от вас, если и как вы храните данные. - UserDict - это реализация
MutableMapping
с использованием внутреннего "реального"dict
в качестве хранилища. Если вы хотите иметь подобную дискету хранения, но переопределите некоторые методы, выставленныеdict
, это может быть хорошей отправной точкой для вас. Но обязательно прочитайте код, чтобы узнать, как реализуются основные методы, чтобы вы были совместимы при переопределении метода. - dict - это "настоящая вещь". Подкласс это, если вы хотите расширить интерфейс. Переопределение методов для создания пользовательских вещей может быть опасным, так как обычно есть несколько способов доступа к данным, и вы можете получить несогласованный API.