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