On Sat, Feb 14, 2015 at 2:36 PM, Georg Brandl <g.brandl@gmx.net> wrote:
> In the case of int, there is a good reason for this behavior - bool.  In python,
> we want True + True == 2.  In numpy, where binary operations preserve
> subclasses, you have
>
>>>> import numpy
>>>> numpy.bool_(1) + numpy.bool_(1)
> True

I don't think numpy.bool_ subclasses some class like numpy.int_.

And  numpy.bool_ subclasses don't preserve type in addition:

>>> import numpy
>>> class Bool(numpy.bool_):
...     pass
...
>>> numpy.bool_.mro()
[<class 'numpy.bool_'>, <class 'numpy.generic'>, <class 'object'>]
>>> Bool(1) + Bool(1)
True
>>> type(_)
<class 'numpy.bool_'>

So there goes my theory. :-)

I think all these examples just highlight the need for a clear guidance when self.__class__() can be called in base classes to construct instances of derived classes.

Apparently numpy has it both ways.  One way for scalars (see above) and the other for arrays:

>>> class Array(numpy.ndarray):
...     pass
...
>>> a = Array(1)
>>> a[0] = 1
>>> a+a
Array([ 2.])