Je suis entrain de lire le chapitre sur l'heritage des dictionnaires de Dive into Python : http://python.developpez.com/cours/D...ss_methods.php

Et ne comprenant pas très bien comment cela cherche j'ai écrit ce bout de code pour essayer de mieux comprendre. Cuisante échec j'ai plein d'erreur que je ne suis pas sur de comprendre donc je m'en remet à vous :

Code python : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class A(dict):
 
    def __init__(self, name=None, genre=None) :
        self["name"] = name
        self.genre=genre
 
class B(A):
 
    def __init__(self, name=None, genre=None) :
        A.__init__(name, genre)
 
    def __setitem__(self, key, item):
        self.data[key] = item
 
    def __getitem__(self, key):
        return self.data[key]

Resultat :
Code console : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> from test_dict_class import A, B
>>> a = A("rolling stones", "rock")
>>> a["genre"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'genre'
>>> a.genre
'rock'
>>> a["name"]
'rolling stones'
>>> a.name
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'A' object has no attribute 'name'

Je suis étonné qu'il n'y a pas de correspondance entre un attribut de l'objet. Enfin jusque là ça va. C'est ensuite que ça se complique :

Code console : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
>>> b = B("beatles", "pop")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "test_dict_class.py", line 10, in __init__
    A.__init__(self, name, genre)
  File "test_dict_class.py", line 4, in __init__
    self["name"] = name
  File "test_dict_class.py", line 13, in __setitem__
    self.data[key] = item
AttributeError: 'B' object has no attribute 'data'

Pourquoi ligne 4 mon __init__ n'est pas bon ? Pourquoi ligne 6 il n’arrive pas à faire self["name"]=name alors que précédemment il n’y avait aucun problème ? Pourquoi mon objet n'a pas d'attribut data (c'est ce qui est marqué dans le cours) ? (quand je remplace self.data[key] par self[key] c'est encore pire)