Connecting Tech Pros Worldwide Forums | Help | Site Map

A question about inheritance

arserlom@gmail.com
Guest
 
Posts: n/a
#1: Jul 19 '05
Hello I have a question about inheritance in Python. I'd like to do
something like this:

class cl1:
def __init__(self):
self.a = 1

class cl2(cl1):
def __init__(self):
self.b = 2

But in such a way that cl2 instances have atributes 'b' AND 'a'.
Obviously, this is not the way of doing it, because the __init__
definition in cl2 overrides cl1's __init__.

Is there a 'pythonic' way of achieving this?

Armando Serrano




arserlom@gmail.com
Guest
 
Posts: n/a
#2: Jul 19 '05

re: A question about inheritance


Thanks.

Jp Calderone wrote:[color=blue]
> On 8 May 2005 12:07:58 -0700, arserlom@gmail.com wrote:[color=green]
> >Hello I have a question about inheritance in Python. I'd like to do
> >something like this:
> >
> > class cl1:
> > def __init__(self):
> > self.a = 1
> >
> > class cl2(cl1):
> > def __init__(self):
> > self.b = 2
> >
> >But in such a way that cl2 instances have atributes 'b' AND 'a'.
> >Obviously, this is not the way of doing it, because the __init__
> >definition in cl2 overrides cl1's __init__.
> >
> >Is there a 'pythonic' way of achieving this?[/color]
>
> class cl2(cl1):
> def __init__(self):
> cl1.__init__(self)
> self.b = 2
>
> Jp[/color]

Steven Bethard
Guest
 
Posts: n/a
#3: Jul 19 '05

re: A question about inheritance


arserlom@gmail.com wrote:[color=blue]
> Hello I have a question about inheritance in Python. I'd like to do
> something like this:
>
> class cl1:
> def __init__(self):
> self.a = 1
>
> class cl2(cl1):
> def __init__(self):
> self.b = 2
>
> But in such a way that cl2 instances have atributes 'b' AND 'a'.
> Obviously, this is not the way of doing it, because the __init__
> definition in cl2 overrides cl1's __init__.
>
> Is there a 'pythonic' way of achieving this?[/color]

If there's a chance you might have multiple inheritance at some point in
this hierarchy, you might also try using super:

class cl1(object): # note it's a new-style class
def __init__(self):
self.a = 1

class cl2(cl1):
def __init__(self):
super(cl2, self).__init__()
self.b = 2

Note that you probably want a new-style class even if you chose not to
use super in favor of Jp Calderone's suggestion. There are very few
cases for using old-style classes these days.

STeVe
arserlom@gmail.com
Guest
 
Posts: n/a
#4: Jul 19 '05

re: A question about inheritance


Ok, thanks. I didn't know about new-style classes (I had learned python
from a book prior to them).

After reading about new-style classes, I find that your solution is
better because, using super (in general) avoids cl2 from having to know
the implementation details of cl1. This is clearly explained in:

http://www.python.org/2.2.3/descrintro.html#cooperation

Also, when using new-style classes with IDLE, I found some problems
which I talk about in "Modifying CallTips.py to work with with
new-style classes in IDLE.", which I posted in this group.

Steven Bethard wrote:[color=blue]
> arserlom@gmail.com wrote:[color=green]
> > Hello I have a question about inheritance in Python. I'd like to do
> > something like this:
> >
> > class cl1:
> > def __init__(self):
> > self.a = 1
> >
> > class cl2(cl1):
> > def __init__(self):
> > self.b = 2
> >
> > But in such a way that cl2 instances have atributes 'b' AND 'a'.
> > Obviously, this is not the way of doing it, because the __init__
> > definition in cl2 overrides cl1's __init__.
> >
> > Is there a 'pythonic' way of achieving this?[/color]
>
> If there's a chance you might have multiple inheritance at some point[/color]
in[color=blue]
> this hierarchy, you might also try using super:
>
> class cl1(object): # note it's a new-style class
> def __init__(self):
> self.a = 1
>
> class cl2(cl1):
> def __init__(self):
> super(cl2, self).__init__()
> self.b = 2
>
> Note that you probably want a new-style class even if you chose not[/color]
to[color=blue]
> use super in favor of Jp Calderone's suggestion. There are very few
> cases for using old-style classes these days.
>
> STeVe[/color]

Closed Thread