"spir" <denis.s...@free.fr> wrote

Classes are often used to hold common or default attribute.

True

Then, some of these attrs may get custom values for individual
objects of a given type. Simply by overriding the attr on this object

Yes, but then the arttribute becomes an instance attribute which masks
the class one (unless accessed via the class).

But this will not only if the attr is a top-level one; not if it is itself part
of a composite object.

Sorry, you lost me there!

In the latter case, the (sub)attribute is still shared, so the change
affects everybody. So, we must redefine the whole top-level attr
instead. Trivial, but not obvious for me ;-)

Nope, Didn't understand that either. Not sure what you mean by
a sub-attribute or top-level attribute?.

=== sample code ===
#!/usr/bin/env python
# coding: utf-8

# case x is top-level attr
class C(object):
x = 0
y = 0
a = 'u'
def __str__ (self) :
return "C(%s,%s,%s)" %(self.x,self.y,self.a)

Using an instance to access class attributes is IMHO a bad idea.
Better to always access class attributes via the class, it makes it
obvious what you are working with.

c1 = C() ; c2 = C()
c1.x = 1 # change x for c1 only
c1.a = 'v' # change a for c1 only

Really creating new instance attributes called x and a


print c1,c2 # ==> C(1,0,v) C(0,0,u)

# case x is element of composite attr
class P:
x = 0
y = 0
class C(object):
p = P()
a = 'u'
def __str__ (self) :
return "C(%s,%s,%s)" %(self.p.x,self.p.y,self.a)
c1 = C() ; c2 = C()
c1.p.x = 1 # change x for c1, but x is actually shared

Yes but try P.x, it will have the original value of 0
You are again creating a new instance attribute in the instance
of P which is shared by the class C.

c1.a = 'v' # change a for c1 only

Create a new instance variable a

This is consistent with how Python deals with ocal variables in a function:

x = 0

print x
def f()
   print x
   x = 5
   print x

print x

prints

0
0
5
0

The 5 is local to the function and only exists for the duration of the code execution. In the case of an instance the "local" or instyance barianle lasts for the life of the object. The class variable last for the life of the class. (and in Python you can del() a class... to end its life - but it will exist until the last instance is
destroyed because each instance has a reference to it.)

HTH,


--
Alan Gauld
Author of the Learn to Program web site
http://www.alan-g.me.uk/

_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to