[Pyrex] pyrex functions to replace a method (Re: replace a method in class: how?)
onurb at xiludom.gro
Wed Jun 28 12:19:13 CEST 2006
Greg Ewing wrote:
> Brian Blais wrote:
>> I have found a very similar problem trying to replace a method using a
>> function defined in pyrex.
> Functions defined in Pyrex are C-implemented functions,
> which don't trigger the method binding magic when you
> access them through a class. The same thing happens if
> you try to use a built-in function as a method.
> What *should* work is to define the method inside a
> class in Pyrex (plain class, not extension type) and
> extract it out of the class's __dict__. That's because
> Pyrex pre-wraps a function defined in a class in an
> unbound method object before putting it in the class.
Or write the needed descriptor and wrap the function in (Q&D, needs a
lot of improvements):
def CFuncWrapper(func, instance):
def _wrappedCFunc(*args, **kw):
return func(instance, *args, **kw)
def __init__(self, func):
self.func = func
def __get__(self, instance, cls=None):
return CFuncWrapper(self.func, instance)
assert(cls is not None)
>>> class Foo(object): pass
>>> Foo.isa = CFuncMethodType(isinstance)
>>> Foo.isa(Foo(), Foo)
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