pyrex functions to replace a method (Re: replace a method in class: how?)

Bruno Desthuilliers onurb at xiludom.gro
Tue Jun 27 08:13:49 EDT 2006


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 'onurb at xiludom.gro'.split('@')])"



More information about the Python-list mailing list