Problème avec l'heritage de dict
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:
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:
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:
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)