• # quelques remarques

    Posté par . En réponse au message Je cherche à créer une expèce de proxy. Évalué à 2. Dernière modification le 18 avril 2014 à 19:35.

    Attention, __getattr__ est censé renvoyé la valeur d'un attribut. Ton implémentation actuelle renvoie une méthode qui renvoie la valeur de l'attribut pour _obj. Est-ce que tu ne voudrais pas plutôt faire ? :

     def __getattr__(self,name):
     return getattr(self.__dict__['_obj'],name)

    Pour l'appel direct c[0], de ce que j'ai testé, l'interpréteur utilise la méthode __getitem__, mais en l'appelant directement, sans passer par __getattr__. Du coup, tu peux t'en sortir en ajoutant la méthode:

     def __getitem__(self, key):
     return self.__dict__['_obj'].__getitem__(key)

    Si tu veux pouvoir affecter un élément de la liste, il faut que tu ajoutes aussi __setitem__. Bref, pour faire propre, il faudrait ajouter tous les __<methode>__ de la classe qui t'intéresse (inclus __repr__ et __str__ pour faire joli).

    Mais du coup, tu te retrouves avec un proxy spécialisé pour les listes, ce qui n'est pas forcément ce que tu veux. L'étape d'après est de lister tous les attributs de la classes que tu veux proxifier, et rajouter les méthode __*__ dont tu as besoin à l'instanciation. Et du coup, il y a surement une recette quelque part sur le net.

    Edit: je vois que je répond un peu à côté de la question sur les __getitem__ et compagnie