Inconsistent behavior of descriptors
John Roth
newsgroups at jhrothjr.com
Wed Oct 1 09:08:42 EDT 2003
"Denis S. Otkidach" <ods at strana.ru> wrote in message
news:mailman.1065009784.807.python-list at python.org...
> On Wed, 1 Oct 2003, John Roth wrote:
>
> JR> The behavior of descriptors is documented in the article on
> JR> the python web site. You might have to hunt a bit to find
> JR> it.
>
> http://users.rcn.com/python/download/Descriptor.htm
> "The implementation works through a precedence chain that gives
> data descriptors priority over instance variables, instance
> variables priority over non-data descriptors, and assigns lowest
> priority to __getattr__ if provided."
>
> I can't see any reason why "data descriptors" have priority over
> instance variables anyway.
>
> JR> The reason for the inconsistency is simply that descriptors
> JR> with only a __get__ method are used for methods, functions
> JR> and similar entities, while descriptors with both __get__
> JR> and
> JR> __put__ are used for properties and similar entities.
>
> There are many examples when data (in common sense) descriptors
> are used with the only __get__ method defined, i.e. non-data
> descriptors in your terms. Here are two I use most frequently:
>
> class CachedAttribute(object):
>
> def __init__(self, method, name=None):
> self.method = method
> self.name = name or method.__name__
>
> def __get__(self, inst, cls):
> # Some tricks here to walk around bug in Python 2.2 are
> # skiped
> result = self.method(inst)
> setattr(inst, self.name, result)
> return result
>
>
> class ReadAliasAttribute(object):
>
> def __init__(self, name):
> self.name = name
>
> def __get__(self, inst, cls):
> return getattr(inst, self.name)
>
>
> JR> It's useful to be able to put a unique version of a function
> JR> or method in an instance, it would completely subvert the
> JR> meaning of a property if you could do so.
>
> Why? You can't do it directly anyway if __set__ method is
> defined.
***********************************************
***********************************************
But that's ***WHY*** you can't do it if the __set__ method
is defined.
***********************************************
John Roth
>
> --
> Denis S. Otkidach
> http://www.python.ru/ [ru]
>
>
More information about the Python-list
mailing list