[Numpy-discussion] Please help with subclassing numpy.ndarray
Reggie Dugard
reggie@merfinllc....
Wed Feb 7 17:32:16 CST 2007
On Wed, 2007-02-07 at 14:36 -0700, Travis Oliphant wrote:
> Sturla Molden wrote:
>
> >>def __new__(cls,...)
> >> ...
> >> (H, edges) = numpy.histogramdd(..)
> >> cls.__defaultedges = edges
> >>
> >>def __array_finalize__(self, obj):
> >> if not hasattr(self, 'edges'):
> >> self.edges = self.__defaultedges
> >>
> >>
> >
> >So in order to get an instance attribute, one has to temporarily define it
> >as a class attribute?
> >
>
> No, you don't *have* to do it this way for all instance attributes.
>
> In this example, the user was trying to keep the edges computed during
> the __new__ method as an attribute. What are the possibilities?
>
> 1) Use the __new__ method to create the object in full and then store
> the edges in some kind of global (or class global) variable.
>
> This solution because it uses global variables has all of the thread
> problems global variables bring.
>
> 2) Create a "dummy" arrayobject in the __new__ method and fill it in
> (i.e. using setstate or resize) during the __init__ method where the
> instance attribute is actually set.
>
I'm probably missing something obvious here, but why can't you just
attach the attribute to the actual object in the __new__ method before
returning it. For example:
class MyClass(numpy.ndarray):
def __new__(self, ...):
# Some stuff here
H, edges = numpy.histogramdd(...)
result = H.view(MyClass)
result.edges = edges
return result
def __array_finalize__(self, obj):
self.edges = getattr(obj, 'edges', [])
If you could show me the error of my ways, it would help me in *my*
attempt to subclass ndarray.
> The __array_finalize__ method is intended for "passing-on" attributes to
> sub-classes from parent classes during operations where __new__ and
> __init__ are not called (but a new instance is still created). It was
> not intended to be used in all circumstances.
Thanks,
-Reggie
More information about the Numpy-discussion
mailing list