[Cython] PEP 3135 -- New Super

Stefan Behnel stefan_ml at behnel.de
Tue Jul 12 12:42:44 CEST 2011


mark florisson, 12.07.2011 12:11:
> On 12 July 2011 11:46, Vitja Makarov wrote:
>> 2011/7/12 Stefan Behnel
>>>
>>> Vitja Makarov, 12.07.2011 09:46:
>>>>
>>>> About cdef classes: probably it's better to
>>>> transform super().method(...) into direct form, e.g. BaseClass.method(self,
>>>> ...)
>>>
>>> Except when it doesn't work. ;)
>>>
>>>    A
>>>   / \
>>>   B  C
>>>   \ /
>>>    D
>>>
>>> The MRO here is D-B-A-C. If C unconditionally calls A.method(), A's implementation will be called twice, as it was already called by B.
>>>
>>> http://www.python.org/download/releases/2.2/descrintro/#mro
>>
>> According to your link mro in the example is DBCA ;)

Totally proves my point. ;)


>> Is that a problem for cdef classes? Cdef class have only one base, isn't it?
>
> That is irrelevant, if B calls A's method then C's method will be
> skipped. If it would use super() it would call C's method, and C's
> method would call A's method.

Exactly. So, calling directly into the base classes method implementation 
(i.e. issuing a direct C function call) makes a suitable optimisation for 
"final" classes, but not for the general case.

Stefan


More information about the cython-devel mailing list