ClassName.attribute vs self.__class__.attribute

Gabriel Rossetti gabriel.rossetti at
Thu Jun 12 08:54:30 CEST 2008

Bruno Desthuilliers wrote:
> Gabriel Rossetti a écrit :
>> Larry Bates wrote:
>>> 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
>>> -- 
>> A class instance variable, you must mean an instance attribute no? 
> I think that's what he meant, yes.
>> If that is so, then with just self.attribute? Maybe there is a 
>> concept that I don't know about, 
> The concept of name resolution (aka lookup) rules in Python, perhaps ? 
> When you do obj.attribute, attribute is first looked for in the 
> object, then in it's class, then in the parent classes. So yes, you 
> can get a class (or parent class) attribute directly on the instance. 
> Note that assignment on the instance (obj.attribute = value) will 
> alway (computed attributes or other hooks excepted) create the 
> attribute on the target, so if you have Class.attribute set, and then 
> do obj = Class(); obj.attribute = 42, then obj.attribute will shadow 
> Class.attribute.
Not really, see my answer to Mike Orr's msg.
>> I've studied class/static attributes and instance attributes in my 
>> OOP classes.
> Forget about your OOP classes, mostly if it was in fact a Java or C++ 
> class. Python's object model is very far away from what most courses 
> present as "OOP".
Ok, in some ways yes.
>> Gabriel
> -- 

More information about the Python-list mailing list