Hi, 2010/1/11 Benjamin Peterson <benja...@python.org>: > Consider this program: > > class Descr(object): > def __init__(self, name): > self.name = name > def __set__(self, instance, what): > instance.__dict__[self.name] = what > > class X(object): > attr = Descr("attr") > > x = X() > print(x.attr) > x.attr = 42 > print(x.attr) > > It gives in output: > > <__main__.Descr object at 0x7fe1c9b28150> > 42 > > The documentation [1] says that Descr is a data descriptor because it > defines the __set__ method. It also states that data descriptors > always override the value in the instance dictionary. So, the second > line should also be the descriptor object according to the > documentation. > > My question is: Is this a doc bug or a implementation bug? If the > former, it will be the description of a data descriptor much less > consistent, since it will require that a __get__ method be present, > too. If the latter, the fix may break some programs relying on the > ability to "cache" a value in the instance dictionary. > > [1] http://docs.python.org/reference/datamodel#invoking-descriptors
Quoting the documentation: """Normally, data descriptors define both __get__() and __set__(), while non-data descriptors have just the __get__() method. """ Your example is neither a data descriptor nor a non-data descriptor... The thing that worries me a bit is the "x.attr" returning the Descr object. Descriptors should remain at the class level, and instance should only see values. I'd prefer an AttributeError in this case. -- Amaury Forgeot d'Arc _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com