ClassName.attribute vs self.__class__.attribute

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

"Casey McGinty" <casey.mcginty at> wrote in message 
news:ae3f58470806051341s75052c29s7adcc4c994462618 at
| On Thu, Jun 5, 2008 at 5:40 AM, Gabriel Rossetti <
| gabriel.rossetti at> wrote:
| > Hello everyone,
| >
| > I had read somewhere that it is preferred to use 
| > over ClassName.attribute to access class (aka static) attributes. I had 
| > this and it seamed to work, until I subclassed a class using this 
| > and from there on things started screwing up. I finally tracked it down 
| > self.__class__.attribute! What was happening is that the child classes 
| > over-rode the class attribute at their level, and the parent's was 
| > set, so while I was thinking that I had indeed a class attribute set in 
| > 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, 
| > suggest never using self.__class__.attribute, unless you don't mind 
| > children overriding it, but if you want a truly top-level class 
| > use ClassName.attribute everywhere!
| Thanks for the info. Can anyone explain more about the differences 
| 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.
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