class object's attribute is also the instance's attribute?

Marco Nawijn nawijn at gmail.com
Thu Aug 30 10:11:06 EDT 2012


On Thursday, August 30, 2012 3:25:52 PM UTC+2, Hans Mulder wrote:
> On 30/08/12 14:34:51, Marco Nawijn wrote:
> 
> 
> 
> > Note that if you change 'd' it will change for all instances!
> 
> 
> 
> That depends on how you change it.
> 
> 
> 
> >>>> bobj = A()
> 
> >>>> bobj.d
> 
> > 'my attribute'
> 
> > 
> 
> >>>> A.d = 'oops...attribute changed'
> 
> 
> 
> Here you change the attribute on the class.
> 
> That will affect all instances:
> 
> 
> 
> >>>> aobj.d
> 
> > 'oops...attribute changed'
> 
> > 
> 
> >>>> bobj.d
> 
> > 'oops...attribute changed'
> 
> 
> 
> You can also set the attribute on an instance:
> 
> 
> 
> >>> bobj.d = 'For bobj only'
> 
> >>> bobj.d
> 
> 'For bobj only'
> 
> >>>> aobj.d
> 
> > 'oops...attribute changed'
> 
> 
> 
> So, if you specifically change it on one instance, thenit won't
> 
> change on other instances of the same class.
> 
> 
> 
> > If you want attributes to be local to the instance, you have
> 
> > to define them in the __init__ section of the class like this:
> 
> 
> 
> That's a good idea, but it's not required.  You can set them
> 
> later, as shown above.
> 
> 
> 
> 
> 
> > class A(object):
> 
> > 
> 
> >    def __init__(self):
> 
> >         d = 'my attribute'
> 
> 
> 
> That will just set the global variable d.
> 
> You want to set the instance attribute:
> 
> 
> 
>         self.d = 'my attribute'
> 
> 
> 
> >>>> aobj = A()
> 
> >>>> bobj = A()
> 
> > 
> 
> >>>> aobj.d
> 
> > 'my attribute'
> 
> 
> 
> Note that aobj.d will not find the global variable d,
> 
> if neither the instance, nor the class nor any of the
> 
> base classes have that attribute.
> 
> 
> 
> I don't know where this 'my attribute' comes from, but
> 
> it's not the instance attribute you tried to set in the
> 
> __init__ method.  Maybe your class A still has a class
> 
> attribute with that value from an earlier experiment.
> 
> 
> 
> 
> 
> Hope this helps,
> 
> 
> 
> -- HansM

Learned my lesson today. Don't assume you know something. Test it first ;). I have done quite some programming in Python, but did not know that class attributes are still local to the instances. It is also a little surprising I must say. I always considered them like static variables in C++ (not that I am an expert in C++). 

I knew of course that you don't have to define a local attribute in the __init__ method of a class, but I consider it good style and since the OP is a self claimed newbie I left out the other option. 

The missing "self" in the code below was a typo
class A(object): 
 
    def __init__(self): 
        d = 'my attribute'   # should be self.d 

Regards,

Marco



More information about the Python-list mailing list