mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
bpo-20751: Replace method example with attribute example, matching the descriptor howto (GH-29909)
This commit is contained in:
parent
0ae4e0c959
commit
135ecc3492
1 changed files with 32 additions and 4 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue