On Mon, 4 Oct 2010 09:06:39 am Robert wrote:
> Why is "f1" not affected by the Class-level variable change below ?
The Python terminology is "attribute", not variable. You have class
attributes and instance attributes.
> >>> class Foo( object ):
> ... myid = 'Foo'
> ... def __init__( self ):
> ... pass
That __init__ method does nothing. Leave it out:
class Foo(object):
myid = 'Foo'
> >>> f1 = Foo()
> >>> f2 = Foo()
> >>> f1.myid = 'Bar'
This creates an instance attribute called myid which masks the class
attribute.
> >>> Foo.myid = 'SPAM'
This directly changes the class attribute.
Think of it this way: when you lookup an attribute, Python searches:
* the instance
* the class
* any superclasses
in that order, and returns the first matching value it finds. When you
set an attribute, Python follows the same pattern, but naturally the
first attempt (instance) will always succeed. (Note: this may not be
what Python *actually* does, but conceptually it has always helped me
reason about the behaviour.)
Python won't let you accidentally modify a class attribute. You have to
do it explicitly. Here are three ways to do it:
type(f1).myid = 'Bar'
f1.__class__.myid = 'Bar'
Foo.myid = 'Bar'
(You might be able to do some sort of metaclass magic to change this
behaviour, but consider that *very* advanced.)
--
Steven D'Aprano
_______________________________________________
Tutor maillist - [email protected]
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor