Ответ
Чтобы объект вел себя как словарь (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-объект.