Я хочу написать собственный класс, который ведет себя как 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: <встроенный идентификатор функции>
Что не так с приведенным выше кодом?
Как мне исправить класс, myDictчтобы я мог писать такой код?
md = myDict()
md['id'] = 123
[Редактировать]
Я отредактировал приведенный выше пример кода, чтобы избавиться от глупой ошибки, которую допустил до того, как выскочил из-за стола. Это была опечатка (я должен был заметить это по сообщению об ошибке).
dict, вам следует использовать сам объект (usingsuper) вместо того, чтобы просто делегировать его экземпляру__dict__- что по сути означает, что вы создаете два dicts для каждого экземпляра.