URL: https://linuxfr.org/forums/programmation-python/posts/je-cherche-a-creer-une-expece-de-proxy Title: Je cherche à créer une expèce de proxy Authors: totof2000 Date: 2014年04月18日T18:39:35+02:00 License: CC By-SA Tags: Score: 1 Bonjour. J'essaie de créer un proxy en python. Le but est de pouvoir utiliser mon objet comme l'objet qu'il encapsule. J'ai commencé par ça (le code n'est peut-être pas propre, plein de commentaires oui d'affichage bidon, mais c'est pour voir ce qui se passe : il ne passera pas en prod mais me sert à comprendre ce qui se passe): ```python #!/usr/bin/python class MyClass(object): def __init__(self,_class=None): print("Initialization of class MyClass without args\n") o=_class() print("Type object : " + str(o.__class__())) self.__dict__['_obj']=o def __getattr__(self,name): def _missing(*args, **kwargs): print "A missing method was called." print "The object was %r, the method was %r. " % (self, name) print "It was called with %r and %r as arguments" % (args, kwargs) return getattr(self.__dict__['_obj'],name) return _missing c=MyClass(list) x=c.append() print ("value : " + str(c[0])) ``` A l'exécution, j'ai ce message : ```sh ./test1.py Initialization of class MyClass without args Type object : [] A missing method was called. The object was <__main__.myclass object at 0x7f9c4aa63ad0>, the method was 'append'. It was called with () and {} as arguments Traceback (most recent call last): File "./test1.py", line 27, in print ("value : " + str(c[0])) TypeError: 'MyClass' object does not support indexing ``` Ce que j'en ai compris, c'est que je n'ai pas implémenté la méthode `__getitem__` dans ma classe. Or, je croyais que la méthode non implémentée serait intercptée par `__getattr__` , mais il semble que je me sois trompé. Y aurait-il un autre niveau ou je pourrais intercepter toutes les méthodes définies, pour pouvoir les rediriger vers mon objet ? En ruby, je peux le faire : ```ruby #!/usr/bin/ruby # # class Test def initialize() end def initialize(obj) @obj=obj.new() end def method_missing(meth,*args,&block) puts("Method: #{meth}, args : #{args}") @obj.send(meth.to_sym,*args) end end x=Test.new(Array) x.push("abc") x.push("def") puts("x[0]: #{x[0]}") ``` Le résultat : ```sh $ ruby test1.rb Method: push, args : abc Method: push, args : def Method: [], args : 0 x[0]: abc ``` Merci d'avance.

AltStyle によって変換されたページ (->オリジナル) /