Я хочу реализовать класс, который перенесется - не, разделяют на подклассы - Python dict
объект, так, чтобы, когда изменение обнаруживается в запоминающем устройстве, я мог воссоздать делегированный объект dict. Я намереваюсь проверить на изменения в запоминающем устройстве каждый раз, когда к dict получают доступ для чтения.
Предположим, я должен был создать объект действовать как это; какие методы я должен был бы реализовать?
Вы можете подклассифицировать ABC (абстрактный базовый класс) collections.Mapping
(или collections.MutableMapping
, если вы также хотите позволить коду, использующему ваши экземпляры, изменять смоделированный/обернутый словарь, например, путем индексированного присвоения, pop
и т.д.).
Если вы это сделаете, то, как несколько косвенно намекают документы, на которые я указал, методы, которые вам нужно реализовать, это
__len__
__iter__
__getitem__
(для Mapping
) -- вы должны также реализовать
__contains__
потому что делегирование дикту, который вы оборачиваете, может быть сделано намного быстрее, чем итерационный подход, который ABC пришлось бы применять в противном случае.
Если вам нужно предоставить MutableMapping
, то вам также нужно реализовать еще 2 метода:
__setitem__
__delitem__
В дополнение к тому, что уже было предложено, вы можете взглянуть на UserDict .
В качестве примера dict-подобного объекта вы можете прочитать реализацию сеанса django , в частности класс SessionBase
.
Я думаю, это зависит от того, какие методы вы используете. Возможно, __getitem__
, __setitem__
, __iter__
и __len__
, поскольку большинство вещей можно реализовать в терминах этих методов. Но вы захотите посмотреть на некоторые случаи использования, особенно с __iter__
. Что-то вроде этого:
for key in wrapped_dictionary:
do_something(wrapped_dictionary[key])
... будет медленным, если вы будете обращаться к источнику данных на каждой итерации, не говоря уже о том, что это может даже не сработать, если источник данных меняется из-под вашего носа. Поэтому, возможно, вы захотите сделать исключение и реализовать iteritems
в качестве альтернативы, загружая все пары ключ-значение одним пакетом, прежде чем вы выполните цикл.
В Python docs есть списки элементов, где можно найти методы и примеры использования.