Voglio scrivere una classe personalizzata che si comporti come dict
- quindi, sto ereditando da dict
.
La mia domanda, tuttavia, è: devo creare un dict
membro privato nel mio __init__()
metodo ?. Non vedo il senso di questo, dal momento che ho già il dict
comportamento se eredito semplicemente da dict
.
Qualcuno può sottolineare perché la maggior parte degli snippet di eredità assomiglia a quello qui sotto?
class CustomDictOne(dict):
def __init__(self):
self._mydict = {}
# other methods follow
Invece del più semplice ...
class CustomDictTwo(dict):
def __init__(self):
# initialize my other stuff here ...
# other methods follow
In realtà, penso di sospettare che la risposta alla domanda sia così che gli utenti non possono accedere direttamente al tuo dizionario (cioè devono usare i metodi di accesso che hai fornito).
Tuttavia, per quanto riguarda l'operatore di accesso all'array []
? Come implementarlo? Finora non ho visto un esempio che mostra come sovrascrivere l' []
operatore.
Quindi se una []
funzione di accesso non è fornita nella classe personalizzata, i metodi di base ereditati funzioneranno su un dizionario diverso?
Ho provato il seguente frammento per testare la mia comprensione dell'ereditarietà di 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]
Ho ricevuto il seguente errore:
KeyError: <ID funzione incorporata>
Cosa c'è di sbagliato nel codice sopra?
Come correggo la classe in myDict
modo da poter scrivere codice come questo?
md = myDict()
md['id'] = 123
[Modificare]
Ho modificato il codice di esempio sopra per eliminare lo stupido errore che ho fatto prima di precipitarmi via dalla scrivania. Era un errore di battitura (avrei dovuto individuarlo dal messaggio di errore).
dict
, dovresti usare l'oggetto stesso (usandosuper
) invece di delegare semplicemente all'istanza, il__dict__
che significa essenzialmente che stai creando due dict per ogni istanza.