Je veux écrire une classe personnalisée qui se comporte comme dict
- donc, j'hérite de dict
.
Ma question, cependant, est: Dois-je créer un dict
membre privé dans ma __init__()
méthode?. Je ne vois pas l'intérêt de cela, car j'ai déjà le dict
comportement si j'hérite simplement dict
.
Quelqu'un peut-il expliquer pourquoi la plupart des extraits d'héritage ressemblent à celui ci-dessous?
class CustomDictOne(dict):
def __init__(self):
self._mydict = {}
# other methods follow
Au lieu du plus simple ...
class CustomDictTwo(dict):
def __init__(self):
# initialize my other stuff here ...
# other methods follow
En fait, je pense que je soupçonne que la réponse à la question est que les utilisateurs ne peuvent pas accéder directement à votre dictionnaire (c'est-à-dire qu'ils doivent utiliser les méthodes d'accès que vous avez fournies).
Cependant, qu'en est-il de l'opérateur d'accès au tableau []
? Comment mettre en œuvre cela? Jusqu'à présent, je n'ai pas vu d'exemple qui montre comment remplacer l' []
opérateur.
Donc, si une []
fonction d'accès n'est pas fournie dans la classe personnalisée, les méthodes de base héritées fonctionneront sur un dictionnaire différent?
J'ai essayé l'extrait de code suivant pour tester ma compréhension de l'héritage 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]
J'ai eu l'erreur suivante:
KeyError: <id de la fonction intégrée>
Quel est le problème avec le code ci-dessus?
Comment corriger la classe myDict
pour pouvoir écrire du code comme celui-ci?
md = myDict()
md['id'] = 123
[Éditer]
J'ai modifié l'exemple de code ci-dessus pour me débarrasser de l'erreur stupide que j'ai faite avant de me précipiter loin de mon bureau. C'était une faute de frappe (j'aurais dû le repérer dans le message d'erreur).
dict
- classe , vous devez utiliser l'objet lui-même (en utilisantsuper
) au lieu de simplement déléguer à l'instance__dict__
- ce qui signifie essentiellement que vous créez deux dictionnaires pour chaque instance.