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.