__iadd__ for a subclass of array - howto

Ian Kelly ian.g.kelly at gmail.com
Mon Aug 5 03:59:09 EDT 2013


On Mon, Aug 5, 2013 at 1:34 AM, Helmut Jarausch
<jarausch at igpm.rwth-aachen.de> wrote:
> Hi,
>
> I'd like to subclass array.array and implement operators like __iadd__
> How can this be accomplished.
>
> I'tried
>
> from array import array
>
> class Vec(array) :
>   def __new__(cls,Vinit) :
>     return array.__new__(cls,'d',Vinit)
>
>   def __init__(self,*args) :
>     self.N = len(self)
>
>   def __str__(self) :
>     out=[ "{}".format(self.__getitem__(i)) for i in range(0,self.N) ]
>     return ",".join(out)
>
>   def __iadd__(self,Op) :
> #    for i,x in enumerate(self) :
> #      x+= Op[i]                     # this doesn't update self
>     for i in range(0,self.N) :
>       (self.__getitem__(i))+= Op[i]  # __getitem__ doesn't return a "reference" (like in C++)
>     return self


for i in range(len(self)):
    self[i] += Op[i]

There's no reason to be calling __getitem__ directly.  Use the
operators and let Python decide what to call.



More information about the Python-list mailing list