suizokukan a écrit :
(1) ou bien j'arrive à récupérer le nom de la classe mère (dict) de chaque objet.
(2) ou bien je fais un dir() sur l'objet et je vérifie la présence de has_key(), clear(), copy(), getitems(), par exemple.
(3) ou bien j'attends l'arrivée d'une exception.
(4) ou bien j'ajoute un attribut bidon dans D1,D2,... et je teste la présence de cet attribut dans chaque objet. J'espère que ma question n'est pas trop c****... merci de m'aider
|
ou alors tu utilises tout simplement hasattr
>>> class Object(dict):
... pass
...
>>> o = Object()
>>> hasattr(o, "has_key" )
True |
Edit: utiliser hasattr permet de faire du duck typing (*): au lieu de tester ce qu'est l'objet, on teste ce dont il est capable, et si ses capacités correspondent à ce qu'on veut alors il est valide.
Parce que, par exemple
>>> import UserDict
>>> class Object(UserDict.UserDict):
... pass
...
>>> a = Object()
>>> isinstance(a, dict)
False |
alors que UserDict est un dictionnaire parfaitement classique (c'était la classe dictionnary dérivable avant que "dict" ne le soit), simplement comme UserDict n'est pas dérivé de dict Object ne l'est pas non plus, et a n'est donc pas une instance de dict.
(*) Duck Typing, principe formalisé sur une mailing list Ruby:
Citation :
if it looks like a duck and it quacks like a duck, it's a duck
|
=> Si ça a une tête de canard et que ça fait un bruit de canard, alors c'est un canard.
Avantage, c'est que pour les langages hautement dynamiques comme Python ou Ruby dans lesquels on peut très facilement rajouter des membres/méthodes on se base sur les capacités des objets et non sur leur classe initiale (qui n'a en fait aucune importance)
Message édité par masklinn le 23-08-2005 à 08:47:53
---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody