Bon, pour ne pas mourir idiot, j'aimerais savoir ce que vous pensez de mon idée de départ et de la manière dont je l'ai implémentée.
J'ai une classe C avec de nombreux attributs (des entiers et des fonctions). Pour ce qui est des entiers, j'aimerais pouvoir vérifier automatiquement comment les affectations se font (du genre, interdit d'entrer des valeurs trop grandes). Pour plus de souplesse, je mets mes attributs dans un dictionnaire et j'en contrôle l'accès à l'aide de __getattribute__ / __setattr__ :
Code :
- class C(dict):
- def __init__(self):
- # les valeurs par défaut :
- self["v1"] = 0
- self["v2"] = 0
-
- def __setattr__(self, name, value):
- if name in self:
- self[name][0] = value
- # ... et j'ajoute ici une vérification sur "value"
- else:
- raise # exception pour signaler qu'on tente de modifier un attribut qui n'existe pas.
- def __getattribute__(self, name):
- if name in self:
- return self[name] # je retourne la valeur demandée.
- else:
- raise # exception pour signaler qu'on tente d'accéder à un attribut qui n'existe pas.
- def foo:
- pass # je coupe : code sans intérêt
|
Ca fonctionne; mais __getattribute__ intercepte aussi les appels de fonction, par exemple :
... et j'ai droit à un message d'erreur (le raise dans __getattribute__), puisque mon c.__getattribute__ récupère un "foo" en argument et que "foo" n'existe pas dans le dictionnaire. Comment réécrire __getattribute__ de manière à ne pas torpiller les appels aux fonctions de C ?
Si vous pouviez me dire ce que vous en pensez... Merci !
edit : correction du nom de la fonction dans ma classe.
Message édité par suizokukan le 19-09-2006 à 22:57:03
---------------
rule #1 : trust the python