manatlan wrote: > To explain better, here is another code
> class JQueryCaller(object): > def __init__(self,callback): > self.__callback=callback > self._s=[] > > def __getattr__(self,name): > def _caller(*args): > sargs=["'%s'"%i for i in args] > self._s.append("%s(%s)"%(name,",".join(sargs))) > return self > return _caller > > def __call__(self): > return self.__callback(".".join(self._s)) > > > class MyObject(list): > def __init__(self): > list.__init__([]) > > js=property(lambda self:JQueryCaller(self.__add)) > > def __add(self,j): > self.append(j) > > > if __name__ == "__main__": > o=MyObject() > > o.js.kiki(12).kuku()() > o.js.kiki(12).kuku().roro("gfde")() > > assert o==["kiki('12').kuku()", "kiki('12').kuku().roro('gfde')"] > here, it uses the __call__ of JQueryCaller by adding the "()" trick at > the end ... > > I'd really like to have the same result, without the "()" trick, like > this: > > o=MyObject() > > o.js.kiki(12).kuku() > o.js.kiki(12).kuku().roro("gfde") > > assert o==["kiki('12').kuku()", "kiki('12').kuku().roro('gfde')"] You could preallocate slots in MyObject: from functools import partial class JQueryCaller(object): def __init__(self,callback): self.__callback=callback self._s=[] def __getattr__(self,name): def _caller(*args): sargs=["'%s'"%i for i in args] self._s.append("%s(%s)"%(name,",".join(sargs))) self.__callback(".".join(self._s)) return self return _caller class MyObject(list): def __init__(self): list.__init__([]) @property def js(self): n = len(self) self.append(None) return JQueryCaller(partial(self._add, n)) def _add(self, i, j): self[i] = j if __name__ == "__main__": o=MyObject() o.js.kiki(12).kuku() o.js.kiki(12).kuku().roro("gfde") assert o==["kiki('12').kuku()", "kiki('12').kuku().roro('gfde')"] This will course fail if you try things like a = o.js.kiki a(1) a(2) Peter -- http://mail.python.org/mailman/listinfo/python-list