class attribute confusion
Arnaud Delobelle
arnodel at gmail.com
Fri Dec 3 17:11:09 EST 2010
OAN <programming at 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.
--
Arnaud
More information about the Python-list
mailing list