Quero escrever uma classe personalizada que se comporte assim dict
- então, estou herdando de dict
.
Minha pergunta, porém, é: Preciso criar um dict
membro privado em meu __init__()
método? Não vejo sentido nisso, já que tenho o dict
comportamento de simplesmente herdar de dict
.
Alguém pode apontar por que a maioria dos snippets de herança se parece com o abaixo?
class CustomDictOne(dict):
def __init__(self):
self._mydict = {}
# other methods follow
Em vez do mais simples ...
class CustomDictTwo(dict):
def __init__(self):
# initialize my other stuff here ...
# other methods follow
Na verdade, acho que suspeito que a resposta à pergunta seja para que os usuários não possam acessar diretamente o seu dicionário (ou seja, eles precisam usar os métodos de acesso que você forneceu).
No entanto, e quanto ao operador de acesso à matriz []
? Como alguém implementaria isso? Até agora, não vi um exemplo que mostra como substituir o []
operador.
Portanto, se uma []
função de acesso não for fornecida na classe personalizada, os métodos de base herdados estarão operando em um dicionário diferente?
Tentei o seguinte snippet para testar minha compreensão da herança do 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]
Recebi o seguinte erro:
KeyError: <id da função integrada>
O que há de errado com o código acima?
Como faço para corrigir a classe myDict
para poder escrever um código como este?
md = myDict()
md['id'] = 123
[Editar]
Eu editei o exemplo de código acima para me livrar do erro bobo que cometi antes de sair correndo de minha mesa. Foi um erro de digitação (eu deveria ter percebido na mensagem de erro).
dict
, deverá usar o próprio objeto (usingsuper
) em vez de simplesmente delegar à instância__dict__
- o que significa essencialmente que você está criando dois dicts para cada instância.