Commit a0995deb authored by Georg Brandl's avatar Georg Brandl

Merged revisions 77603 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r77603 | benjamin.peterson | 2010-01-19 00:07:56 +0100 (Di, 19 Jan 2010) | 8 lines

  data descriptors do not override the class dictionary if __get__ is not defined

  Adjust documentation and add a test to verify this behavior.

  See http://mail.python.org/pipermail/python-dev/2010-January/095637.html for
  discussion.
........
parent 0cdc2257
...@@ -1603,11 +1603,17 @@ Super Binding ...@@ -1603,11 +1603,17 @@ Super Binding
``A.__dict__['m'].__get__(obj, A)``. ``A.__dict__['m'].__get__(obj, A)``.
For instance bindings, the precedence of descriptor invocation depends on the For instance bindings, the precedence of descriptor invocation depends on the
which descriptor methods are defined. Normally, data descriptors define both which descriptor methods are defined. A descriptor can define any combination
:meth:`__get__` and :meth:`__set__`, while non-data descriptors have just the of :meth:`__get__`, :meth:`__set__` and :meth:`__delete__`. If it does not
:meth:`__get__` method. Data descriptors always override a redefinition in an define :meth:`__get__`, then accessing the attribute will return the descriptor
object itself unless there is a value in the object's instance dictionary. If
the descriptor defines :meth:`__set__` and/or :meth:`__delete__`, it is a data
descriptor; if it defines neither, it is a non-data descriptor. Normally, data
descriptors define both :meth:`__get__` and :meth:`__set__`, while non-data
descriptors have just the :meth:`__get__` method. Data descriptors with
:meth:`__set__` and :meth:`__get__` defined always override a redefinition in an
instance dictionary. In contrast, non-data descriptors can be overridden by instance dictionary. In contrast, non-data descriptors can be overridden by
instances. [#]_ instances.
Python methods (including :func:`staticmethod` and :func:`classmethod`) are Python methods (including :func:`staticmethod` and :func:`classmethod`) are
implemented as non-data descriptors. Accordingly, instances can redefine and implemented as non-data descriptors. Accordingly, instances can redefine and
...@@ -2476,13 +2482,6 @@ object itself in order to be consistently invoked by the interpreter). ...@@ -2476,13 +2482,6 @@ object itself in order to be consistently invoked by the interpreter).
controlled conditions. It generally isn't a good idea though, since it can controlled conditions. It generally isn't a good idea though, since it can
lead to some very strange behaviour if it is handled incorrectly. lead to some very strange behaviour if it is handled incorrectly.
.. [#] A descriptor can define any combination of :meth:`__get__`,
:meth:`__set__` and :meth:`__delete__`. If it does not define :meth:`__get__`,
then accessing the attribute even on an instance will return the descriptor
object itself. If the descriptor defines :meth:`__set__` and/or
:meth:`__delete__`, it is a data descriptor; if it defines neither, it is a
non-data descriptor.
.. [#] For operands of the same type, it is assumed that if the non-reflected method .. [#] For operands of the same type, it is assumed that if the non-reflected method
(such as :meth:`__add__`) fails the operation is not supported, which is why the (such as :meth:`__add__`) fails the operation is not supported, which is why the
reflected method is not called. reflected method is not called.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment