[Cython] non-virtual methods

Stefan Behnel stefan_ml at behnel.de
Thu Aug 25 19:08:16 CEST 2011


Vitja Makarov, 25.08.2011 18:11:
> 2011/8/24 Stefan Behnel:
>> Vitja Makarov, 24.08.2011 21:17:
>>> I tried final classes:
>>> 2. In this example foo call is done through virtual table
>>>
>>> cimport cython
>>>
>>> @cython.final
>>> cdef class Foo:
>>>      cdef foo(self):
>>>          print 'haha'
>>>
>>> def test():
>>>      cdef Foo a = Foo()
>>>      a.foo()
>>>
>>>    __pyx_t_1 = ((struct __pyx_vtabstruct_3yyy_Foo
>>> *)__pyx_v_a->__pyx_vtab)->foo(__pyx_v_a); if (unlikely(!__pyx_t_1))
>>> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno =
>>> __LINE__; goto __pyx_L1_error;}
>>
>> Right, this is not implemented yet. Feel free to do so. Also see
>>
>> http://trac.cython.org/cython_trac/ticket/474
>>
>>
>>> 3. I can't use final decorator for methods (error reported)
>>
>> http://trac.cython.org/cython_trac/ticket/586
>
> What is the prefered syntax keyword inline or final decorator?

"final" is the right option here.

They are orthogonal concepts. Only because you declare a method "final" 
does not mean you want to inline it, and just because you declare it 
"inline" does not (necessarily) mean that you cannot override it. 
Admittedly, the semantics of an overridable inline method may turn out to 
be somewhat obscure and error prone, so I think it's a good idea to let 
"inline" imply "final". But not the other way round.

Stefan


More information about the cython-devel mailing list