class members vs instance members

H

hdixon

Ive spent a few days going thru a couple of Python tutorials. No
problem until I got to classes. I guess my java mindset is blocking my
vision. I've borrowed another thread's code snippet and cannot explain
the results:
class MyClass:
list = []
myvar = 10

def add(self, x):
self.list.append(x)
self.myvar = x

def printer(self):
print self.list
print self.myvar

a = MyClass()
b = MyClass()

for n in range(20):
a.add(n)

print "list in a:"
a.printer()
print "list in b:"
b.printer()

This produces:
list in a:
list in a:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
19
list in b:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
10

WHY do the "class members" list and myvar seem to behave differently?
Given the way that list[] is supposedly shared why doesnt myvar exhibit
the same behavior? It seems that myvar is acting like a true "instance
member". Is this simply because of the underlying types?


TIA
 
S

Sybren Stuvel

hdixon enlightened us with:
class MyClass:
list = []
myvar = 10

def add(self, x):
self.list.append(x)
self.myvar = x

Here is your difference. In the add() function, self.myvar is assigned
a value. This means self.myvar is an instance variable. If you had
assigned MyClass.myvar = x, then it would have been as you expected.

Sybren
 
B

Bruno Desthuilliers

hdixon a écrit :
Ive spent a few days going thru a couple of Python tutorials. No
problem until I got to classes. I guess my java mindset is blocking my
vision.

Then http://dirtsimple.org/2004/12/python-is-not-java.html
I've borrowed another thread's code snippet and cannot explain
the results:
class MyClass:

class MyClass(object):
list = []

This may not be too harmful in the given context, nut shadowing builtin
types may not be a good idea.
myvar = 10

def add(self, x):
self.list.append(x)

"list" is a class attribute. It's shared by all instances of MyClass.
This is a FAQ AFAICT.
self.myvar = x

This creates an instance attribute named myvar that shadows the class
attribute of the same name

(snip expected results)
WHY do the "class members" list and myvar seem to behave differently?

cf above. And notice that in Python, binding (aka 'assignement') and
name lookup on objects are different beasts. There have been quite a few
threads about this recently.
Given the way that list[] is supposedly shared why doesnt myvar exhibit
the same behavior?

Because binding to self.myvar creates the instance attribute "myvar".
Notice that you have not rebound "list".
It seems that myvar is acting like a true "instance
member".

It is one.
Is this simply because of the underlying types?

Nope, it's because in the first case (MyClass.list, accessed as
self.list) you just call methods on the list object, which has no effect
on the binding.
 
H

hdixon

Bruno said:
hdixon a écrit :
Ive spent a few days going thru a couple of Python tutorials. No
problem until I got to classes. I guess my java mindset is blocking my
vision.

Then http://dirtsimple.org/2004/12/python-is-not-java.html
I've borrowed another thread's code snippet and cannot explain
the results:
class MyClass:

class MyClass(object):
list = []

This may not be too harmful in the given context, nut shadowing builtin
types may not be a good idea.
myvar = 10

def add(self, x):
self.list.append(x)

"list" is a class attribute. It's shared by all instances of MyClass.
This is a FAQ AFAICT.
self.myvar = x

This creates an instance attribute named myvar that shadows the class
attribute of the same name

(snip expected results)
WHY do the "class members" list and myvar seem to behave differently?

cf above. And notice that in Python, binding (aka 'assignement') and
name lookup on objects are different beasts. There have been quite a few
threads about this recently.
Given the way that list[] is supposedly shared why doesnt myvar exhibit
the same behavior?

Because binding to self.myvar creates the instance attribute "myvar".
Notice that you have not rebound "list".
It seems that myvar is acting like a true "instance
member".

It is one.
Is this simply because of the underlying types?

Nope, it's because in the first case (MyClass.list, accessed as
self.list) you just call methods on the list object, which has no effect
on the binding.

ok - i "think" its beginning to dawn on me. BTW - the blog above was a
good read for me. I _am_ trying to bring java into the mix and its
screwing me up big time. I'll go back over the chapters that dicuss
binding/name lookups.


Thanks
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,770
Messages
2,569,583
Members
45,072
Latest member
trafficcone

Latest Threads

Top