surcharger __getattribute__ [vaguement résolu] - Python - Programmation
Marsh Posté le 19-09-2006 à 22:14:25
Et si tu utilisais des property plutôt ?
Si j'ai bien compris ton truc, ça correspond exactement à ce que tu veux faire : http://www.python.org/download/rel [...] /#property
Marsh Posté le 19-09-2006 à 22:18:25
> multani : merci du coup de main. Je connais les properties mais je ne les utilise pas volontairement. En effet, pour chaque attribut tu dois créer une property. Or je voudrais créer un seul couple de fonctions [get/set] pour vérifier l'accès à toutes les variables de ma classe. Un peu comme s'il existait un property pour un ensemble de variables.
Marsh Posté le 19-09-2006 à 22:34:23
Tu peux toujours essayer de récupérer par reflexion (avec getattr) une référence vers la méthode, si la clé n'est pas dans le dictionnaire. Mais tu risques d'être coincer au niveau des arguments à passer à la méthode après (je passe la main pour ça).
Sinon, ce serait pas plus simple de faire deux fonctions get/set, qui prennent en premier argument le nom de ton attribut ?
Marsh Posté le 19-09-2006 à 22:42:45
> multani : pour ta deuxième idée, ce serait "plus simple", mais moins élégant. Et ma petite () expérience me prouve qu'il ne faut jamais négliger la simplicité dans la lecture du code d'un projet. D'autant que le mien s'annonce long et difficile (pour moi !)
Je me débats donc avec ta première remarque et je cherche toujours un exemple qui me serait accessible d' overriding de la fonction __getattribute__... Et moi, je ne peux pas passer la main.
Merci de ton aide.
Marsh Posté le 19-09-2006 à 22:56:18
Bon, je crois y être arrivé, mais quel merd*** ! Y va falloir que je relise de la doc...
Code :
|
En fait, __getattr__ n'a pas l'air d'intercepter les appels de fonction ... ?!?!
Donc voici le comportement attendu (et effectif) de cette classe :
Code :
|
Marsh Posté le 19-09-2006 à 22:59:34
En fait, je vois pas. On peut pas utiliser getattr dans __getattribute__, sinon, on se mange un "RuntimeError: maximum recursion depth exceeded", donc c'est ratal
Marsh Posté le 19-09-2006 à 23:03:13
> multani : et pour clore (?) ce débat, est-ce que tu verrais une autre manière de résoudre le problème initial ? Peut-être est-ce ma classe qui est mal fichue. Sur des détails de conception comme celui-ci, je manque beaucoup d'expérience.
Merci pour ton coup de main.
Marsh Posté le 19-09-2006 à 23:07:13
avec getattribute, il faut tout faire au niveau de la résolution. y compris déléguer à la classe parente.
Marsh Posté le 19-09-2006 à 23:10:01
> Taz, c'est vraiment un sujet difficile pour moi, mais je tente de m'accrocher. Pourrais-tu me donner quelques explications ? Ou un bout de code ?
Marsh Posté le 19-09-2006 à 23:10:58
Là, du coup, je vois pas trop l'intérêt d'hériter de dict ...
Marsh Posté le 21-09-2006 à 15:42:38
Citation : En effet, pour chaque attribut tu dois créer une property. Or je voudrais créer un seul couple de fonctions [get/set] pour vérifier l'accès à toutes les variables de ma classe. Un peu comme s'il existait un property pour un ensemble de variables. |
Résultat tu t'emmerdes et tu fais des trucs crades
Marsh Posté le 19-09-2006 à 21:48:33
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__ :
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