Subclassing array

2006-05-04 Thread TG
Hi.

i've already something about inheriting from array a few weeks ago and
had my answer. But again, there is something that I don't understand.
Here is my vector class, which works quite well :

class Vector(array):
def __new__(cls,length,data=None):
return super(Vector,cls).__new__(cls,'f')

def __init__(self,length,data=None):
if data == None:
for _ in xrange(length):
self.append(0.0)
else:
for i in xrange(length):
self.append(data[i])



Now, i want to inherit from this vector class :

class Stimulus(Vector):
def __init__(self,width,height,label,data=None):
Vector.__init__(self,width*height,data)
self.width = width
self.height = height
self.label = label

This doesn't seem to work :
>>> s = Stimulus(10,10,"data")
TypeError: __new__() takes at most 3 arguments (4 given)

In order to make it work, it seems that I have to redefine __new__
again, like this.

def __new__(cls,width,height,label,data=None):
return super(Stimulus,cls).__new__(cls,width*height)

Why is that ?
When I call Vector.__init__() in Stimulus, doesn't it also call __new__
? I don't understand the detail of callings to __new__ and __init__ in
python inheritance ...

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Subclassing array

2006-05-04 Thread Alex Martelli
TG <[EMAIL PROTECTED]> wrote:
   ...
> When I call Vector.__init__() in Stimulus, doesn't it also call __new__
> ? I don't understand the detail of callings to __new__ and __init__ in
> python inheritance ...

Calling a (new-style) class does __new__ first, THEN calls the class's
__init__ on the resulting instance -- and the arguments you're passing
when calling the class go to both __new__ and __init__.


Alex
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Subclassing array

2006-05-04 Thread Sion Arrowsmith
Alex Martelli <[EMAIL PROTECTED]> wrote:
>TG <[EMAIL PROTECTED]> wrote:
>> When I call Vector.__init__() in Stimulus, doesn't it also call __new__
>> ? I don't understand the detail of callings to __new__ and __init__ in
>> python inheritance ...
>Calling a (new-style) class does __new__ first, THEN calls the class's
>__init__ on the resulting instance -- and the arguments you're passing
>when calling the class go to both __new__ and __init__.

... so you might want something like:

class Vector(array):
def __new__(cls,*args):
return super(Vector,cls).__new__(cls,'f')

-- 
\S -- [EMAIL PROTECTED] -- http://www.chaos.org.uk/~sion/
  ___  |  "Frankly I have no feelings towards penguins one way or the other"
  \X/  |-- Arthur C. Clarke
   her nu becomeþ se bera eadward ofdun hlæddre heafdes bæce bump bump bump
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Subclassing array

2006-05-04 Thread Bruno Desthuilliers
Sion Arrowsmith a écrit :
> Alex Martelli <[EMAIL PROTECTED]> wrote:
> 
>>TG <[EMAIL PROTECTED]> wrote:
>>
>>>When I call Vector.__init__() in Stimulus, doesn't it also call __new__
>>>? I don't understand the detail of callings to __new__ and __init__ in
>>>python inheritance ...
>>
>>Calling a (new-style) class does __new__ first, THEN calls the class's
>>__init__ on the resulting instance -- and the arguments you're passing
>>when calling the class go to both __new__ and __init__.
> 
> 
> ... so you might want something like:
> 
> class Vector(array):
> def __new__(cls,*args):
> return super(Vector,cls).__new__(cls,'f')
> 
And if you want to support named arguments:

class Vector(array):
 def __new__(cls,*args, **kw):
 return super(Vector,cls).__new__(cls,'f')
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Subclassing array

2006-05-05 Thread TG
That's great, thanks !

To put it short, when I create a Stimulus object, it first seek
__new__() method. But if I don't define it, it looks for the one
defined in Vector. This raises a problem because the parameters passed
to Stimulus(params) aren't fitting with Vector parameters, raising an
exception.

That's why I have to use this *arg **kw syntax in order to allow my
subclasses having any arguments without causing troubles. Am I right ?

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Subclassing array

2006-05-05 Thread bruno at modulix
TG wrote:
> That's great, thanks !
> 
> To put it short, when I create a Stimulus object, it first seek
> __new__() method. But if I don't define it, it looks for the one
> defined in Vector. This raises a problem because the parameters passed
> to Stimulus(params) aren't fitting with Vector parameters, raising an
> exception.
> 
> That's why I have to use this *arg **kw syntax in order to allow my
> subclasses having any arguments without causing troubles. Am I right ?
> 

To put it short : yes !-)

-- 
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in '[EMAIL PROTECTED]'.split('@')])"
-- 
http://mail.python.org/mailman/listinfo/python-list