deriving from array.array

Alf P. Steinbach alfps at start.no
Tue Jan 26 14:23:57 EST 2010


* Alf P. Steinbach:
> * Torsten Mohr:
>> Hello,
>>
>> i try to derive a class from array.array:
>>
>>
>> import array
>>
>> class Abc(array.array):
>>     def __init__(self, a, b):
>>         array.array.__init__(self, 'B')
>>         self.a = a
>>         self.b = b
>>
>>
>> a = Abc(4, 5)
>> print a
>> print a.a
>>
>>
>> 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__.
> 
> 
>>  Though i explicitly
>> call __init__() for array.
> 
> That's the constructor inherited from 'object', it takes no args (except 
> the self arg).
> 
> 
>> I'd like to use array and make sure it's type is always 'B'.
>> I'd like to derive because i don't want to rewrite all the methods 
>> like __getiem__ for my class and then call array's __getitem__.
>>
>> How do i best derive from array.array?
> 
> <code>
> import array
> 
> class ByteArray( array.array ):
>     def __new__( self, *args ):
>         return array.array.__new__( self, "B" )
> 
>     def __init__( self, a, b ):
>         array.array.__init__( self )
>         self.a = a
>         self.b = b
> 
> a = ByteArray( 4, 5 )
> print( a )
> print( a.a )
> </code>
> 
> 
> Disclaimer: I'm not a Python programmer. :-)

Hm, good that I included a disclaimer. The above code is technically OK but it 
is misleading. The first argument to '__new__' is not a self argument but a type 
argument, better called 'cls' or some such.

 From the docs, "__new__() is a static method (special-cased so you need not 
declare it as such) that takes the class of which an instance was requested as 
its first argument"


Cheers,

- Alf (self-correcting)



More information about the Python-list mailing list