Alex Martelli napisaĆ(a): >> Can you also check my reasoning for getting attributes? >> >> value = obj.attr >> * if instance class has __getattribute__, call it >> * else: lookup "attr" in all parent classes using class __mro__; >> if it's a descriptor call its __get__ method, return its value >> otherwise (when descriptor doesn't have __get__, it's unreadable >> and AttributeError is raised) >> * else: check instance __dict__ for "attr", return it when found >> * else: lookup __getattr__ in instance class and call it when found >> * else: raise AttributeError > > No, the value found in the instance (your second 'else' here) takes > precedence if the descriptor found in the first 'else' is > non-overriding.
Oh, right. My mistake comes from the subtle difference between defining descriptor as a class and by property() builtin (I've tested only second option and assumed that descriptor without __set__ cannot be rebinded): class non_overriding(object): def __get__(*a): return 12 class C(object): x = non_overriding() y = property(lambda s:23) c = C() c.x = 4 print c.x # => 4 c.y = 5 # => AttributeError: can't set attribute IMHO that's not very consistent. Well, probably some code rely on this, so I just have to live with it. Thanks for your time and patience in explaining my doubts. mk -- . o . >> http://joker.linuxstuff.pl << . . o It's easier to get forgiveness for being wrong o o o than forgiveness for being right. -- http://mail.python.org/mailman/listinfo/python-list