ClassName.attribute vs self.__class__.attribute

Larry Bates larry.bates at websafe.com`
Thu Jun 5 21:36:17 CEST 2008


Gabriel Rossetti 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!
> 
> I wish books and tutorials mentioned this explicitly....
> 
> Gabriel

If you define a class instance variable with the same name as the class 
attribute, how would Python be able to distinguish the two?  That is a feature 
not a problem.  Getter looks for instance attribute, if one is not found it 
looks for a class attribute, and upwards.  This behavior is used by Zope to do 
all sorts of neat stuff.

-Larry Bates



More information about the Python-list mailing list