ClassName.attribute vs self.__class__.attribute

Bruno Desthuilliers bruno.42.desthuilliers at websiteburo.invalid
Fri Jun 6 16:46:08 CEST 2008

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.

> 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".

> Gabriel

More information about the Python-list mailing list