Related: 
http://stackoverflow.com/questions/10857515/cannot-inherit-from-multiple-classes-defining-slots

On Sat, Mar 9, 2013 at 12:28 AM, Robert Bradshaw
<rober...@math.washington.edu> wrote:
> Ugh. Usually, multiple inheritance from extension types in Python (and
> hence Cython) is prohibited because the base types have different
> layouts, e.g.
>
> class C(Integer, RealDoubleElement): pass
>    ...:
> ------------------------------------------------------------
> Traceback (most recent call last):
>   File "<ipython console>", line 1, in <module>
> TypeError: Error when calling the metaclass bases
>     multiple bases have instance lay-out conflict
>
> Here the class layouts are compatible, so no error on construction,
> but the vtables are not. The simple solution is to simply disallow
> such inheritance, supporting it dynamically would be tricky or
> expensive (or both).
>
> On Sat, Mar 9, 2013 at 12:05 AM, Simon King <simon.k...@uni-jena.de> wrote:
>> Hi!
>>
>> Currently, I try to make homsets and morphisms compliant with what one
>> would usually do when implementing parents and elements---in particular,
>> the default __mul__ and __add__ should do something meaningful and should
>> thus not be overridden. In particular, one would implement addition in
>> subclasses by providing a method _add_, not __add__.
>>
>> But this implies a subtle problem, in
>> sage.homology.chain_complex_morphism.ChainComplexMorphism.
>>
>> I guess one would like to define it as follows,
>>     class ChainComplexMorphism(Morphism, ModuleElement)
>> because it is a morphism, on the one hand, but a module element, on the
>> other hand.
>>
>> Both Morphism and ModuleElement are extension classes with their own cdef
>> attributes/methods, but it *is* possible to inherit from both (Python
>> does not throw an error, i.e., it does not complain about incompatible
>> layouts).
>>
>> If one makes ChainComplexMorphism use the __add__ method inherited from
>> ModuleElement, then eventually the line
>>     return (<ModuleElement>left)._add_(<ModuleElement>right)
>> is executed. But "(<ModuleElement>left)._add_" returns a totally
>> different cdef method, namely "(<Map>left)._update_slots"! Example:
>>
>>     sage: cython("""
>>     ....: from sage.categories.map cimport Map
>>     ....: from sage.structure.element cimport ModuleElement
>>     ....: def test(a):
>>     ....:     return <void*>((<ModuleElement>a)._add_) == <void 
>> *>((<Map>a)._update_slots)
>>     ....: """)
>>     sage: from sage.categories.map import Map
>>     sage: class C(Map, ModuleElement): pass
>>     ....:
>>     sage: test(a)
>>     True
>>     sage: a._add_(a)
>>     Traceback (most recent call last):
>>     ...
>>     ... in sage.structure.element.ModuleElement._add_ 
>> (sage/structure/element.c:9801)()
>>     ... in sage.categories.map.Map._update_slots 
>> (sage/categories/map.c:2633)()
>>     TypeError: 'C' object has no attribute '__getitem__'
>>
>> So, _add_ can not be accessed, and in particular one can not use the
>> default __add__ (which is essential for using the coercion model) on a
>> class that inherits from both Map and ModuleElement.
>>
>> Do you see a work around?
>>
>> I asked this question on the cython-users list, too (sorry for those who
>> read both), but I think it is as much a question about sage than a
>> question about cython.
>>
>> Best regards,
>> Simon
>>
>>
>> --
>> You received this message because you are subscribed to the Google Groups 
>> "sage-devel" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to sage-devel+unsubscr...@googlegroups.com.
>> To post to this group, send email to sage-devel@googlegroups.com.
>> Visit this group at http://groups.google.com/group/sage-devel?hl=en.
>> For more options, visit https://groups.google.com/groups/opt_out.
>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"sage-devel" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sage-devel+unsubscr...@googlegroups.com.
To post to this group, send email to sage-devel@googlegroups.com.
Visit this group at http://groups.google.com/group/sage-devel?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to