[Numpy-discussion] Please help with subclassing numpy.ndarray
Travis Oliphant
oliphant@ee.byu....
Wed Feb 7 17:41:47 CST 2007
Reggie Dugard wrote:
>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:
>
>
Good point. I guess I thought the OP had tried that already. It turns
out it works fine, too.
The __array_finalize__ is useful if you want the attribute to be carried
around when arrays are created automatically internally (after math
operations for example).
-Travis
More information about the Numpy-discussion
mailing list