Hi, Brian Granger wrote: > I am realizing that this is also a problem. I was creating a memory > leak by having both the subclass and superclass do allocations in > their own __cinit__. The trick you propose: > > cdef class Foo: > > cdef __cinit__(self): > self._actual_cinit(self) > cdef _actual_cinit(self): > foo_ptr = doTheAllocation() > > cdef class Bar(Foo): > > cdef _actual_cinit(self): > bar_ptr = doTheAllocation() > > When I try this pattern Foo's _actual_cinit *always gets called.* I > looked at the generated C code and it look like this: > > __pyx_1 = ((struct __pyx_vtabstruct_6txbase_Foo *)((struct > __pyx_obj_6txbase_Foo *)__pyx_v_self)->__pyx_vtab)->_actualCinit() > > When I made _actualCinit(), I got an attribute error (which makes > sense as the Python side of the class has not been built yet.) > > Why is the vtable not finding the right _actualCinit implementation? > Is this a bug, or is this to be expected because the class has not > been fully built.
Hmmm, this should work (but in case vtab is not initialised correctly at this point, I would consider that a bug). > Also, why can't I just do the allocations in the __init__ method? > That has a much more flexible and explicit approach when dealing with > subclasses. The call to __init__() is a Python thing. Imagine a subclass that overrides __init__ and forgets to make a super() call. Stefan _______________________________________________ Cython-dev mailing list [email protected] http://codespeak.net/mailman/listinfo/cython-dev
