[Numpy-discussion] my derived ndarray class object loses its attribute after a transpose()

Sebastian Haase haase@msg.ucsf....
Fri Nov 23 10:01:22 CST 2007


On Nov 23, 2007 4:43 PM, Sebastian Haase <haase@msg.ucsf.edu> wrote:
> On Nov 23, 2007 3:37 PM, Pierre GM <pgmdevlist@gmail.com> wrote:
> > On Friday 23 November 2007 03:25:37 Sebastian Haase wrote:
> > > Hi,
> > > this question might habe been answered before:
> > > I have my own ndarray-derived class. I did this, so that I can add
> > > another "custom attribute" -- let's say
> > > arr.filename
> >
> > Sebastian,
> > Could you post the __new__ and __array_finalize__ for your class ? Are you
> > sure you update the attribute in __array_finalize__ ?
> > And this page may come handy:
> > http://www.scipy.org/Subclasses
>
> Aah - I guess I did not do my homework ;-)
> Here is my code:
>         class ndarray_inMrcFile(N.memmap):
>             pass
>
>         data = self.data
>         data.__class__ = ndarray_inMrcFile
>
> Two points:
> 1.) Please don't get distracted by the way how I change the class type
> "after the fact". I get the data as a memmaped slice from a file. Then
> I do some (potentially not entirely clean) acrobatic to have this
> slice change it's class-type so that I can attach the original memmap
> (+ other attributes, such as filename) onto the ndarray
>
> 2.) I guess the   """class ndarray_inMrcFile(N.memmap):
> pass""" construct is to simplistic ....
>    Could someone suggest a *minimal* definition, so that my attributes
> would be preserved ?
>
>
> A few comments about the wiki page:
> 1)  The example does not show the printed info, such as "__new__
> received %s", in the example session
>
> 2) I don't understand, why in the example the "info" attribute is set
> in "__new__()", even though the text above says:
> """However, we need to keep in mind that any attribute that we define
> in the __new__ method will be shared among all the instances. If we
> want instance-specific attributes, we still need some specific
> initialization. We cannot use the __init__ method, as it won't be
> called. That's where __array_finalize__ comes to play."""
>
> 3) the text about "The __array_finalize__ method"  should at least
> once say that it is defined as "def __array_finalize__(self,obj)"  --
> otherwise I could only guess where the "obj" comes from.
>
> 4) related to the text after: "In other terms, __array_finalize__ is called"
> How do I know if a function or method actually  invokes __new__  ;-)
> ?  Would I have to study the numpy source ?
>
> 5) For the "__array_finalize__ method" there a text that says:
> """Subclasses inherit a default implementation of this method that
> does nothing""" --- but how about "__new__()" :  what happens if you
> don't define that (either) ?
>
> (Hope these comments are helpful)
>
> Thanks for the help,
> Sebastian
>


First try seems to show that just changing my class def to:
        class ndarray_inMrcFile(N.memmap):
             def __array_finalize__(self,obj):
                  self.Mrc = getattr(obj, 'Mrc', None)

Seems to add the wanted attribute back into result of transpose().
However now I get (many!) exceptions like:
Exception exceptions.AttributeError: "'ndarray_inMrcFile' object has no attribut
e '_mmap'" in <bound method ndarray_inMrcFile.__del__ of
ndarray_inMrcFile([ 6,....

Do I need to call super.__array_finalize__(obj) first ?

-Sebastian


More information about the Numpy-discussion mailing list