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

Reply via email to