[Pyrex] Opaque structures and Extension Types
Lenard Lindstrom
len-l at telus.net
Thu May 15 05:38:10 CEST 2008
Robert Bradshaw wrote:
> On May 14, 2008, at 4:47 PM, Greg Ewing wrote:
>
>
>> Roberto Cavada wrote:
>>
>>
>>> My way of handling allocation and
>>> initialization of classes in C would require that __cinit__ of
>>> derived class would be not called at all, as for example
>>> Worker_create already handles the allocation and initialization of
>>> Person and Worker structures.
>>>
>> I think you'll just have to initialise the struct in
>> __init__ rather than __cinit__, then you'll get
>> control over whether the base class __init__ is
>> called or not.
>>
>> It's not entirely safe, but it's about the best that
>> can be done until I do something about providing a
>> more Python-like __new__ method.
>>
>
> One can also make a cdef method which the (only) baseclass __cinit__
> calls, and simply override this for the subclass. One would want to
> do the same with deallocation as well.
>
>
Maybe that works with Cython, but not Pyrex.
# test.pyx
cdef class Root:
cdef int value
def __cinit__(self):
self.initialize()
def get_value(self):
return self.value
cdef initialize(self):
self.value = 0
cdef class A(Root):
cdef initialize(self):
self.value = 1
cdef class B(A):
cdef initialize(self):
self.value = 2
>>> import test
>>> test.Root().get_value()
0
>>> test.A().get_value()
0
>>> test.B().get_value()
0
C method calls from __cinit__ are not virtual. The vtable of a child
extension type is set only after all the __cinit__ methods of its parent
classes are called.
--
Lenard Lindstrom
<len-l at telus.net>
More information about the Pyrex
mailing list