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 ?
Mmh, I would at least try to explicitly call the N.memmap.__new__
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
OK, I'll edit the example
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."""
Yeah, that's not very clear. Well, look at the code of the example. In line 11, we call a view of the array, with our class as argument. That calls __array_finalize__, with "subarr" as the obj argument. __array_finalize__ sets a default "info" attribute: an empty dictionary, as the argumnet doesn't have an info attribute yet. In lines 14-18, we set the "info" argument of our object to the value we want.
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.
OK, same as for 1.
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 ?
As a rule of thumb, __new__ is called each time you have a construction like MyClass(whatverargumentisneeded). When you rely on views (such as w/ the .view method, or ravel, or transpose...), you call __array_finalize__ . You don't really have to study the numpy code (even if it helps)
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) ?
Try. The ndarray doesn't have a **keywords option: you can't pass extra parameters to ndarray.__new__. In other terms, if you need to pass some specific parameter to your class (in our example, info), you'll choke ndarray.