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