Какие специальные методы Python нужно реализовать для эмуляции поведения словаря?

Ответ

Чтобы объект вел себя как словарь (mapping), он должен реализовывать протокол контейнера. Лучшей практикой является наследование от абстрактного базового класса collections.abc.MutableMapping.

Этот подход требует реализации всего пяти обязательных методов, а остальные (keys, values, items, get, __contains__ и др.) предоставляются автоматически.

Обязательные методы для MutableMapping:

  • __getitem__(self, key): для доступа по ключу (obj[key]).
  • __setitem__(self, key, value): для присвоения значения (obj[key] = value).
  • __delitem__(self, key): для удаления элемента (del obj[key]).
  • __iter__(self): для итерации по ключам (for key in obj).
  • __len__(self): для получения размера (len(obj)).

Пример реализации:

from collections.abc import MutableMapping

class DictLike(MutableMapping):
    def __init__(self, *args, **kwargs):
        # Внутреннее хранилище
        self._storage = dict(*args, **kwargs)

    def __getitem__(self, key):
        return self._storage[key]

    def __setitem__(self, key, value):
        print(f"Установка значения для ключа '{key}'")
        self._storage[key] = value

    def __delitem__(self, key):
        del self._storage[key]

    def __iter__(self):
        return iter(self._storage)

    def __len__(self):
        return len(self._storage)

# Использование
d = DictLike()
d['name'] = 'Alice' # Установка значения для ключа 'name'

print(d['name'])      # Вывод: Alice
print('name' in d)    # Вывод: True (метод __contains__ работает автоматически)
print(list(d.keys())) # Вывод: ['name'] (метод keys() тоже)

Наследование от MutableMapping гарантирует, что ваш класс будет соответствовать стандартному интерфейсу словаря и будет совместим с другими компонентами Python, ожидающими mapping-объект.