[Numpy-discussion] subclassing ndaray
Stefan van der Walt
stefan at sun.ac.za
Sat Feb 25 00:41:01 CST 2006
On Fri, Feb 24, 2006 at 06:40:16PM -0700, Travis Oliphant wrote:
> Stefan van der Walt wrote:
> >I see the same strange result. Here is a minimal code example to
> >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
> It's only strange if you have assumptions your not revealing. Here's
> the deal.
> Neither the __init__ method nor the __new__ method are called for c = b+1.
> So, your wondering how the Bar object got created then right? Well, it
> got created as a subclass of ndarray in PyArray_NewFromDescr.
> The __init__ and __new__ methods are not called because they may have
> arbitrary signatures. Instead, the __array_finalize__ method is always
> called. So, you should use that instead of __init__.
> The __array_finalize__ method always receives the argument of the
> "parent" object.
> Thus in your case.
> def __array_finalize__(self, parent):
> self.v = 3
> would do what you want.
That doesn't seem to work. __array_finalize__ isn't called when the
object is initially constructed:
In : b = Bar(2)
In : b.v
In : b=b+1
In : b.v
Should a person then call __array_finalize__ from __init__?
More information about the Numpy-discussion