extender method

D

davehowey

'Learning Python' by Lutz and Ascher (excellent book by the way)
explains that a subclass can call its superclass constructor as
follows:

class Super:
def method(self):
# do stuff

class Extender(Super):
def method(self):
Super.method(self) # call the method in super
# do more stuff - additional stuff here



I'm trying to use this for a superclass called 'component' in the
constructor. I have different types of component (let's say for
arguments sake resistor, capacitor etc). When I instantiate a new
resistor, say, I want the constructor to call the constructor within
the component superclass, and then add some resistor-specific stuff.

Now, this is fine using the above code. Where I'm struggling is with
argument passing. The following, for example, doesn't seem to work:

class Super:
def __init__(self, **kargs):
self.data = kargs

class Extender(Super):
def __init__(self, **kargs):
Super.__init__(self, kargs) # call the constructor method in Super
# do additional extender-specific stuff here

What am I doing wrong? I get:
TypeError: __init__() takes exactly 1 argument (2 given)
WARNING: Failure executing file: <main.py>

Dave
 
B

Bruno Desthuilliers

'Learning Python' by Lutz and Ascher (excellent book by the way)
explains that a subclass can call its superclass constructor as
follows:
(snip)

Now, this is fine using the above code. Where I'm struggling is with
argument passing. The following, for example, doesn't seem to work:

class Super:
def __init__(self, **kargs):
self.data = kargs

class Extender(Super):
def __init__(self, **kargs):
Super.__init__(self, kargs) # call the constructor method in Super
# do additional extender-specific stuff here

What am I doing wrong? I get:
TypeError: __init__() takes exactly 1 argument (2 given)
WARNING: Failure executing file: <main.py>

class Super(object):
def __init__(self, **kwargs):
self.data = kwargs

class Extender(Super):
def __init__(self, **kwargs):
Super.__init__(self, **kwargs)
# do additional extender-specific stuff here


HTH
 
C

Chris Lambacher

'Learning Python' by Lutz and Ascher (excellent book by the way)
explains that a subclass can call its superclass constructor as
follows:

class Super:
def method(self):
# do stuff

class Extender(Super):
def method(self):
Super.method(self) # call the method in super
# do more stuff - additional stuff here



I'm trying to use this for a superclass called 'component' in the
constructor. I have different types of component (let's say for
arguments sake resistor, capacitor etc). When I instantiate a new
resistor, say, I want the constructor to call the constructor within
the component superclass, and then add some resistor-specific stuff.

Now, this is fine using the above code. Where I'm struggling is with
argument passing. The following, for example, doesn't seem to work:

class Super:
def __init__(self, **kargs):
self.data = kargs

class Extender(Super):
def __init__(self, **kargs):
Super.__init__(self, kargs) # call the constructor method in Super
You mean
Super.__init__(self, **kargs)

Note the ** in the call the parent's init method.
 
S

Simon Forman

'Learning Python' by Lutz and Ascher (excellent book by the way)
explains that a subclass can call its superclass constructor as
follows:

class Super:
def method(self):
# do stuff

class Extender(Super):
def method(self):
Super.method(self) # call the method in super
# do more stuff - additional stuff here



I'm trying to use this for a superclass called 'component' in the
constructor. I have different types of component (let's say for
arguments sake resistor, capacitor etc). When I instantiate a new
resistor, say, I want the constructor to call the constructor within
the component superclass, and then add some resistor-specific stuff.

Now, this is fine using the above code. Where I'm struggling is with
argument passing. The following, for example, doesn't seem to work:

class Super:
def __init__(self, **kargs):
self.data = kargs

class Extender(Super):
def __init__(self, **kargs):
Super.__init__(self, kargs) # call the constructor method in Super
# do additional extender-specific stuff here

What am I doing wrong? I get:
TypeError: __init__() takes exactly 1 argument (2 given)
WARNING: Failure executing file: <main.py>

Dave

Try this:

class Extender(Super):
def __init__(self, **kargs):
Super.__init__(self, **kargs) # call the constructor method in
Super

(add two asterisks to the call.)

Observe, the following script:

def a(*a, **b):
return a, b

print a(**{'arg':2})
print a(arg=2)
print a({'arg':2})

# Prints:

((), {'arg': 2})
((), {'arg': 2})
(({'arg': 2},), {})


HTH,
~Simon
 
P

Paul McGuire

With new-style classes (where Super inherits from object), I think the
preferred style is now:

super(Extender,self).__init__(**kwargs)

Instead of

Super.__init__(self,**kwargs)


class Super(object):
def __init__(self, **kargs):
print kargs
self.data = kargs

class Extender(Super):
def __init__(self, **kargs):
#~ Super.__init__(self, **kargs) # call the constructor method in
Super
super(Extender,self).__init__(**kargs)

e = Extender(a=123)

prints:
{'a': 123}

-- Paul
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,049
Latest member
Allen00Reed

Latest Threads

Top