# [Numpy-discussion] subclassing ndaray

Stefan van der Walt stefan at sun.ac.za
Fri Feb 24 11:16:03 CST 2006

I see the same strange result.  Here is a minimal code example to
demonstrate:

import numpy as N

class Bar(N.ndarray):
v = 0.

def __new__(cls, *args, **kwargs):
print "running new"
return super(Bar, cls).__new__(cls, *args)

def __init__(self, *args, **kwargs):
print "running init"
self[:] = 0
self.v = 3

In [88]: b = Bar(3)
running new
running init

In [89]: b
Out[89]: Bar([0, 0, 0])

In [90]: b.v
Out[90]: 3

In [91]: c = b+1

In [92]: c.v
Out[92]: 0.0

However, if I do b[:] = 1, everything works fine.

Stéfan

On Fri, Feb 24, 2006 at 10:56:02AM -0500, Colin J. Williams wrote:
> I have a subclass Bar, a 1-dim array which has some methods and some
> attributes.  One of the attributes is a view of the Bar to permit
> different shaping.
>
> Suppose that 'a' is an instance of 'Bar', which has a method 'show' and
> a view attribute 'v'.
>
> a ^ 15 returns a Bar instance, with its methods but without the attributes.
>
> I am attempt to change this, Bar has a method __xor__, see below:
>
>      def __xor__(self, other):
>        ''' Exclusive or: __xor__(x, y) => x ^ y . '''
>        z=
>    1
>    <<  this loops to the recursion limit
>        result= ArrayType.__xor__(self, other)
>        n= self.n
>        result.n= n
>        result.rowSize= self.rowSize
>        result.show= self.show
>        result.v= _n.reshape(result.view(), (n*n, n*n))
>        return result
>
> Could anyone suggest a workaround please?
>
> Colin W.