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 ? :
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:
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
# quelques remarques
Posté par gaaaaaAab . 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 ? :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: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