Am 03.12.2010 23:11, schrieb Arnaud Delobelle:
OAN<programm...@toomuchcookies.net>  writes:

Hi,

i was having a problem with class attributes initiated outside of
__init__. This code is a demonstration of what i mean:

class A():
     mylist = []
     def __init__(self):
         self.mylist.append(1)
         pass

class B(A):
     def __init__(self):
         A.__init__(self)
         self.mylist.append(2)

v = A()
print 'v:',v.mylist
x = B()
print 'x:',x.mylist
y = B()
print 'y:',y.mylist
z = A()
print 'z:',z.mylist
print 'v:',v.mylist

I would expect the following result:

v: [1]
x: [1, 2]
y: [1, 2]
z: [1]
v: [1]

Who wouldn't, right? But actually python 2.6(.6) gives me the
following result:

v: [1]
x: [1, 1, 2]
y: [1, 1, 2, 1, 2]
z: [1, 1, 2, 1, 2, 1]
v: [1, 1, 2, 1, 2, 1]

The four variables v,x,y and z now actually share the same 'mylist'!!
To get the correct results, i have to initialize 'mylist' inside of
the __init__ method!
Yes.  See below.

I think this behaviour is totally wrong, since it seems
A.__init__(self) is changing the value inside of A() not inside of the
object variable 'self' (that should be x or y)!!
It's not wrong at all.  You expect "mylist" to behave as an instance
attribute, but you defined it as a class attribute.  Instance attributes
are naturally initialised in the __init__() method.

Could you please point me to a reference in the doc??

Thanks in advance.


--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to