Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Problem when subclass instance changes base class instance variable

Reply
Thread Tools

Problem when subclass instance changes base class instance variable

 
 
Gerry Sutton
Guest
Posts: n/a
 
      04-16-2005
Hi All!

I have noticed a strange behavior when using a constant identifier to
initialize an instance list variable in a base class and then trying to
modifying the list in subclasses by using either the list.extend method or
even by having the subclass create a whole new list in the variable.

The following example illustrates the situation.



Lbase = ['Initial Base Data']

LSub1 = ['SubClass 1 data']

LSub2 = ['SubClass 2 data']



##

class BaseClass:



def __init__(self):

self.data = Lbase #<---- this fails??

# self.data = ['Initial Base Data'] #<---- this works

def printData(self):

print self.data



##

class SubClass1(BaseClass):



def __init__(self):

BaseClass.__init__(self)

self.data.extend(LSub1)

# self.data += LSub1



##

class SubClass2(BaseClass):



def __init__(self):

BaseClass.__init__(self)

self.data.extend(LSub2)

# self.data += LSub2



s1 = SubClass1()

s1.printData()



s2 = SubClass2()

s2.printData()



s11 = SubClass1()

s11.printData()



s21 = SubClass2()

s21.printData()

s1.printData()



>>>


['Initial Base Data', 'SubClass 1 data']

['Initial Base Data', 'SubClass 1 data', 'SubClass 2 data']

['Initial Base Data', 'SubClass 1 data', 'SubClass 2 data', 'SubClass 1
data']

['Initial Base Data', 'SubClass 1 data', 'SubClass 2 data', 'SubClass 1
data', 'SubClass 2 data']

['Initial Base Data', 'SubClass 1 data', 'SubClass 2 data', 'SubClass 1
data', 'SubClass 2 data']

>>>


It looks like the instance variable is acting like a class variable with all
the subclass changes accumulating as more objects are created.

Does anyone have an explanation for this behavior?

Are other mutable sequence types affected the same way?

To fix the problem you simply use a literal list to initialize the variable
in the base class instead of an identifier.

This problem does not exist if the data variable is a string, maybe because
it is immutable?

I am using Python Ver 2.3.

Does this code behave the same way in 2.4,






 
Reply With Quote
 
 
 
 
Peter Otten
Guest
Posts: n/a
 
      04-16-2005
Gerry Sutton wrote:

> I have noticed a strange behavior when using a constant identifier to
> initialize an instance list variable in a base class and then trying to
> modifying the list in subclasses by using either the list.extend method or
> even by having the subclass create a whole new list in the variable.
>
> The following example illustrates the situation.


> Lbase = ['Initial Base Data']


> class BaseClass:
> def __init__(self):
> self.data*=*Lbase*****************#<----**this*fails??


self.data and Lbase are now bound to the same variable. Consequently changes
to that variable through self.data affect Lbase and vice versa. This is
standard Python behaviour. If you want to use Lbase as a kind of initial
value, modify BaseClass to make a (shallow) copy:

class BaseClass:
def __init__(self):
self.data = list(Lbase)

Now every BaseClass instance gets its separate copy. If you have nested
mutables, e. g. a list of lists, look into the copy module for deepcopy().

Peter

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
subclass a class in the namespace of the that subclass Trans Ruby 8 10-23-2008 07:24 AM
Bind an instance of a base to a subclass - can this be done? Lou Pecora Python 8 05-25-2006 03:00 PM
Can you create an instance of a subclass with an existing instance of the base class? Sandra-24 Python 18 04-29-2006 04:01 PM
subclass has a variable that is subclass of same superclass jstorta Java 3 02-20-2006 08:42 PM
converting base class instance to derived class instance Sridhar R Python 14 02-10-2004 02:47 PM



Advertisments