deriving from array.array

Alf P. Steinbach alfps at start.no
Tue Jan 26 14:51:38 EST 2010


* Torsten Mohr:
> 
> thanks a lot for your hint, it works fine.
> 
>>> I get an error for "a = Abc(4, 5)", seems the parameters are
>>> forwarded to array's __init__ as they are.
>> No, with CPython they're forwarded to __new__.
> 
> Not sure if i understand this correctly, if i derive from other
> classes (like wxpython widgets) i always call the bases __init__ .

Well, creation of an object happens in two phases: allocation and initialization.

Allocation reserves memory for the object and creates a sort of default object 
in that memory. This is the job of __new__. The object doesn't exist at all 
before __new__ is called.

Initialization then outfits the object with all that's required for a proper 
object of class T. This is the job of __init__.  __init__ as passed as argument 
the default object created by __new__.

CPython's array.array does both in __new__. It does not override the __init__ it 
inherits from 'object'. To wit:

   >>> import array
   >>> id( array.array.__init__ )
   10965560
   >>> id( object.__init__ )
   10965560
   >>> array.array.__init__ is object.__init__
   True
   >>> _

So overriding __init__ doesn't override any of array.array's functionality.

But you'd have to override __new__ anyway, because with array.array the first 
argument has to be a type code specifying the element type of the array object 
the __new__ should create. An alternative design instead of those type codes 
could have had one subclass for each element type, essentially what you're 
doing, except you're only doing one of those subclasses. Then there would be no 
issue with __new__.


>>>  Though i explicitly
>>> call __init__() for array.
>> That's the constructor inherited from 'object', it takes no args (except
>> the self arg).
> 
> Is there a way to find out what i need to call?

Testing. :-)


>  I haven't found much in
> the documentation.  From writing C extensions i knew about the "new" entry
> in the PyTypeObject struct but it seems there's more behind it.
> In docs.python.org i did not find much, is there an URL where i can read 
> more?

Don't know, sorry. Google?


Cheers,

- Alf



More information about the Python-list mailing list