Я хочу написать пользовательский класс, который ведет себя как dict - так что я наследую от dict.
Мой вопрос, однако, заключается в следующем: нужно ли создать частный член dict в моем методе __init__()?. Я не вижу смысла в этом, так как у меня уже есть поведение dict, если я просто наследую от dict.
Может ли кто-нибудь указать, почему большинство фрагментов наследования выглядят так, как показано ниже?
class CustomDictOne(dict):
def __init__(self):
self._mydict = {}
# other methods follow
Вместо простого...
class CustomDictTwo(dict):
def __init__(self):
# initialize my other stuff here ...
# other methods follow
На самом деле, я думаю, я подозреваю, что ответ на вопрос заключается в том, что пользователи не могут напрямую обращаться к вашему словарю (т.е. им нужно использовать предоставленные вами методы доступа).
Однако как насчет оператора доступа к массиву []? Как это реализовать? До сих пор я не видел примера, который показывает, как переопределить оператор [].
Итак, если функция доступа [] не предоставляется в пользовательском классе, унаследованные базовые методы будут работать в другом словаре?
Я попробовал следующий фрагмент, чтобы проверить свое понимание наследования Python:
class myDict(dict):
def __init__(self):
self._dict = {}
def add(self, id, val):
self._dict[id] = val
md = myDict()
md.add('id', 123)
print md[id]
Я получил следующую ошибку:
KeyError: < встроенная функция id >
Что не так с кодом выше?
Как мне исправить класс myDict, чтобы я мог писать такой код?
md = myDict()
md['id'] = 123
[изменить]
Я редактировал приведенный выше пример кода, чтобы избавиться от глупой ошибки, которую я сделал, прежде чем я удалился от своего стола. Это была опечатка (я должен был заметить ее из сообщения об ошибке).