instance attributes not inherited?

David Hirschfield davidh at ilm.com
Mon Jan 16 00:57:05 CET 2006


Nothing's wrong with python's oop inheritance, you just need to know 
that the parent class' __init__ is not automatically called from a 
subclass' __init__. Just change your code to do that step, and you'll be 
fine:

class Parent( object ):
     def __init__( self ):
         self.x = 9


class Child( Parent ):
     def __init__( self ):
	super(Child,self).__init__()
        print "Inside Child.__init__()"

-David

John M. Gabriele wrote:

>The following short program fails:
>
>
>----------------------- code ------------------------
>#!/usr/bin/python
>
>class Parent( object ):
>     def __init__( self ):
>         self.x = 9
>         print "Inside Parent.__init__()"
>
>
>class Child( Parent ):
>     def __init__( self ):
>         print "Inside Child.__init__()"
>
>
>p1 = Parent()
>p2 = Parent()
>c1 = Child()
>foo = [p1,p2,c1]
>
>for i in foo:
>     print "x =", i.x
>----------------- /code ----------------------
>
>
>
>yielding the following output:
>
>---------------- output ------------------
>Inside Parent.__init__()
>Inside Parent.__init__()
>Inside Child.__init__()
>x = 9
>x = 9
>x =
>Traceback (most recent call last):
>   File "./foo.py", line 21, in ?
>     print "x =", i.x
>AttributeError: 'Child' object has no attribute 'x'
>---------------- /output ---------------------
>
>
>Why isn't the instance attribute x getting inherited?
>
>My experience with OOP has been with C++ and (more
>recently) Java. If I create an instance of a Child object,
>I expect it to *be* a Parent object (just as, if I subclass
>a Car class to create a VW class, I expect all VW's to *be*
>Cars).
>
>That is to say, if there's something a Parent can do, shouldn't
>the Child be able to do it too? Consider a similar program:
>
>------------------- code ------------------------
>#!/usr/bin/python
>
>
>class Parent( object ):
>     def __init__( self ):
>         self.x = 9
>         print "Inside Parent.__init__()"
>
>     def wash_dishes( self ):
>         print "Just washed", self.x, "dishes."
>
>
>class Child( Parent ):
>     def __init__( self ):
>         print "Inside Child.__init__()"
>
>
>p1 = Parent()
>p2 = Parent()
>c1 = Child()
>foo = [p1,p2,c1]
>
>for i in foo:
>     i.wash_dishes()
>------------------- /code -----------------------
>
>But that fails with:
>
>------------------- output ----------------------
>Inside Parent.__init__()
>Inside Parent.__init__()
>Inside Child.__init__()
>Just washed 9 dishes.
>Just washed 9 dishes.
>Just washed
>Traceback (most recent call last):
>   File "./foo.py", line 24, in ?
>     i.wash_dishes()
>   File "./foo.py", line 10, in wash_dishes
>     print "Just washed", self.x, "dishes."
>AttributeError: 'Child' object has no attribute 'x'
>------------------- /output ---------------------
>
>Why isn't this inherited method call working right?
>Is this a problem with Python's notion of how OO works?
>
>Thanks,
>---J
>
>  
>

-- 
Presenting:
mediocre nebula.




More information about the Python-list mailing list