ClassName.attribute vs self.__class__.attribute

Terry Reedy tjreedy at udel.edu
Thu Jun 5 23:39:18 CEST 2008


"Casey McGinty" <casey.mcginty at gmail.com> wrote in message 
news:ae3f58470806051341s75052c29s7adcc4c994462618 at mail.gmail.com...
| On Thu, Jun 5, 2008 at 5:40 AM, Gabriel Rossetti <
| gabriel.rossetti at arimaz.com> wrote:
|
| > Hello everyone,
| >
| > I had read somewhere that it is preferred to use 
self.__class__.attribute
| > over ClassName.attribute to access class (aka static) attributes. I had 
done
| > this and it seamed to work, until I subclassed a class using this 
technique
| > and from there on things started screwing up. I finally tracked it down 
to
| > self.__class__.attribute! What was happening is that the child classes 
each
| > over-rode the class attribute at their level, and the parent's was 
never
| > set, so while I was thinking that I had indeed a class attribute set in 
the
| > parent, it was the child's that was set, and every child had it's own
| > instance! Since it was a locking mechanism, lots of fun to debug... So, 
I
| > suggest never using self.__class__.attribute, unless you don't mind 
it's
| > children overriding it, but if you want a truly top-level class 
attribute,
| > use ClassName.attribute everywhere!
|
| Thanks for the info. Can anyone explain more about the differences 
between
| the two techniques? Why does one work and the other one fail?

If you want to access the attribute of a particular class, to read or 
write, use that class.
   SomeClass.attr
Note that no instance is required or relevant.

If you want to read the attrubute of the class of an instance (or the first 
superclass with the attribute, whatever that class might be, use self.attr 
or self.__class__.attr.  (Use the latter if the instance has (or might 
have) an attribute of the same name).

For setting an attribute, self.attr = x sets it on the instance while 
self.__class__.attr = x sets it on its class.






More information about the Python-list mailing list