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
--
http://mail.python.org/mailman/listinfo/python-list
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
--
http://mail.python.org/mailman/listinfo/python-list