bpo-20751: Replace method example with attribute example, matching the descriptor howto (GH-29909)

This commit is contained in:
Raymond Hettinger 2021-12-03 20:37:08 -06:00 committed by GitHub
parent 0ae4e0c959
commit 135ecc3492
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1818,10 +1818,38 @@ Class Binding
``A.__dict__['x'].__get__(None, A)``.
Super Binding
If ``a`` is an instance of :class:`super`, then the binding ``super(B, obj).m()``
searches ``obj.__class__.__mro__`` for the base class ``A``
immediately following ``B`` and then invokes the descriptor with the call:
``A.__dict__['m'].__get__(obj, obj.__class__)``.
A dotted lookup such as ``super(A, a).x`` searches
``obj.__class__.__mro__`` for a base class ``B`` following ``A`` and then
returns ``B.__dict__['x'].__get__(a, A)``. If not a descriptor, ``x`` is
returned unchanged.
.. testcode::
:hide:
class Desc:
def __get__(*args):
return args
class B:
x = Desc()
class A(B):
x = 999
def m(self):
'Demonstrate these two calls are equivalent'
result1 = super(A, a).x
result2 = B.__dict__['x'].__get__(a, A)
return result1 == result2
.. doctest::
:hide:
>>> a = A()
>>> a.m()
True
For instance bindings, the precedence of descriptor invocation depends on
which descriptor methods are defined. A descriptor can define any combination