Re: instance attributes not inherited?



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.

.



Relevant Pages