Re: instance attributes not inherited?
- From: David Hirschfield <davidh@xxxxxxx>
- Date: Sun, 15 Jan 2006 15:57:05 -0800
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.
.
- Follow-Ups:
- Re: instance attributes not inherited?
- From: John M. Gabriele
- Re: instance attributes not inherited?
- References:
- instance attributes not inherited?
- From: John M. Gabriele
- instance attributes not inherited?
- Prev by Date: instance attributes not inherited?
- Next by Date: Re: Listing partitions (on win32)
- Previous by thread: instance attributes not inherited?
- Next by thread: Re: instance attributes not inherited?
- Index(es):
Relevant Pages
|