Brian Blais wrote: > Thanks for all who replied to this question about replacing a method. I > feel a little sheepish for not having caught that I have to replace it > in the class, not the instance,
But you *can* replace it on a per-instance basis. It's easy, perfectly legal, and can be very convenient. <rant> I'm very sorry that some poster here try to forcefit Javaish restricted OO conception into Python. Free your mind, burn your books, and take full advantage of Python's powerfull object model. </rant> > but I have found a very similar problem > trying to replace a method using a function defined in pyrex. I post > all of the code below, but there are several files. > > The main code is: > > import module_py # import a function from a python module > import module_pyrex # import a function from a pyrex extension module > > class This(object): > > def update1(self,val): > print val > > def update2(self,val): > print "2",val > > def update3(self,val): > print "3",val > > def local_update(obj,val): > > print "local",val > > > This.update1=local_update # replace the method from a local function > This.update2=module_py.python_update # replace the method from a python > module > This.update3=module_pyrex.pyrex_update # replace the method from a > pyrex module Note that - from a purely technical POV - you don't need to define the updateXXX methods in This. You can add methods directly - in fact, defining a function in a class statement will end up doing the same thing as binding it to the class objet outside the class statement. > t=This() > > t.update1('local') # works fine > t.update2('python') # works fine > t.update3('pyrex') # gives a typeerror function takes exactly 2 > arguments (1 given) (snip) > > any ideas why the pyrex function fails? > I don't have much knowledge wrt/ pyrex, but I guess that pyrex functions don't implement the descriptor protocol as pure Python functions do, so the instance object is not passed to the function at calltime. -- bruno desthuilliers python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for p in '[EMAIL PROTECTED]'.split('@')])" -- http://mail.python.org/mailman/listinfo/python-list