@@ -42,7 +42,7 @@ add new capabilities one by one.
4242Simple example: A descriptor that returns a constant
4343----------------------------------------------------
4444
45- The :class: `Ten ` class is a descriptor whose :meth: `__get__ ` method always
45+ The :class: `! Ten ` class is a descriptor whose :meth: `~object. __get__ ` method always
4646returns the constant ``10 ``:
4747
4848.. testcode ::
@@ -120,10 +120,10 @@ different, updated answers each time::
120120 2
121121
122122Besides showing how descriptors can run computations, this example also
123- reveals the purpose of the parameters to :meth: `__get__ `. The *self *
123+ reveals the purpose of the parameters to :meth: `~object. __get__ `. The *self *
124124parameter is *size *, an instance of *DirectorySize *. The *obj * parameter is
125125either *g * or *s *, an instance of *Directory *. It is the *obj * parameter that
126- lets the :meth: `__get__ ` method learn the target directory. The *objtype *
126+ lets the :meth: `~object. __get__ ` method learn the target directory. The *objtype *
127127parameter is the class *Directory *.
128128
129129
@@ -133,7 +133,7 @@ Managed attributes
133133A popular use for descriptors is managing access to instance data. The
134134descriptor is assigned to a public attribute in the class dictionary while the
135135actual data is stored as a private attribute in the instance dictionary. The
136- descriptor's :meth: `__get__ ` and :meth: `__set__ ` methods are triggered when
136+ descriptor's :meth: `~object. __get__ ` and :meth: `~object. __set__ ` methods are triggered when
137137the public attribute is accessed.
138138
139139In the following example, *age * is the public attribute and *_age * is the
@@ -215,9 +215,9 @@ Customized names
215215When a class uses descriptors, it can inform each descriptor about which
216216variable name was used.
217217
218- In this example, the :class: `Person ` class has two descriptor instances,
219- *name * and *age *. When the :class: `Person ` class is defined, it makes a
220- callback to :meth: `__set_name__ ` in *LoggedAccess * so that the field names can
218+ In this example, the :class: `! Person ` class has two descriptor instances,
219+ *name * and *age *. When the :class: `! Person ` class is defined, it makes a
220+ callback to :meth: `~object. __set_name__ ` in *LoggedAccess * so that the field names can
221221be recorded, giving each descriptor its own *public_name * and *private_name *:
222222
223223.. testcode ::
@@ -253,8 +253,8 @@ be recorded, giving each descriptor its own *public_name* and *private_name*:
253253 def birthday(self):
254254 self.age += 1
255255
256- An interactive session shows that the :class: `Person ` class has called
257- :meth: `__set_name__ ` so that the field names would be recorded. Here
256+ An interactive session shows that the :class: `! Person ` class has called
257+ :meth: `~object. __set_name__ ` so that the field names would be recorded. Here
258258we call :func: `vars ` to look up the descriptor without triggering it:
259259
260260.. doctest ::
@@ -294,10 +294,10 @@ The two *Person* instances contain only the private names:
294294Closing thoughts
295295----------------
296296
297- A :term: `descriptor ` is what we call any object that defines :meth: `__get__ `,
298- :meth: `__set__ `, or :meth: `__delete__ `.
297+ A :term: `descriptor ` is what we call any object that defines :meth: `~object. __get__ `,
298+ :meth: `~object. __set__ `, or :meth: `~object. __delete__ `.
299299
300- Optionally, descriptors can have a :meth: `__set_name__ ` method. This is only
300+ Optionally, descriptors can have a :meth: `~object. __set_name__ ` method. This is only
301301used in cases where a descriptor needs to know either the class where it was
302302created or the name of class variable it was assigned to. (This method, if
303303present, is called even if the class is not a descriptor.)
@@ -337,7 +337,7 @@ any data, it verifies that the new value meets various type and range
337337restrictions. If those restrictions aren't met, it raises an exception to
338338prevent data corruption at its source.
339339
340- This :class: `Validator ` class is both an :term: `abstract base class ` and a
340+ This :class: `! Validator ` class is both an :term: `abstract base class ` and a
341341managed attribute descriptor:
342342
343343.. testcode ::
@@ -360,22 +360,22 @@ managed attribute descriptor:
360360 def validate(self, value):
361361 pass
362362
363- Custom validators need to inherit from :class: `Validator ` and must supply a
364- :meth: `validate ` method to test various restrictions as needed.
363+ Custom validators need to inherit from :class: `! Validator ` and must supply a
364+ :meth: `! validate ` method to test various restrictions as needed.
365365
366366
367367Custom validators
368368-----------------
369369
370370Here are three practical data validation utilities:
371371
372- 1) :class: `OneOf ` verifies that a value is one of a restricted set of options.
372+ 1) :class: `! OneOf ` verifies that a value is one of a restricted set of options.
373373
374- 2) :class: `Number ` verifies that a value is either an :class: `int ` or
374+ 2) :class: `! Number ` verifies that a value is either an :class: `int ` or
375375 :class: `float `. Optionally, it verifies that a value is between a given
376376 minimum or maximum.
377377
378- 3) :class: `String ` verifies that a value is a :class: `str `. Optionally, it
378+ 3) :class: `! String ` verifies that a value is a :class: `str `. Optionally, it
379379 validates a given minimum or maximum length. It can validate a
380380 user-defined `predicate
381381 <https://en.wikipedia.org/wiki/Predicate_(mathematical_logic)> `_ as well.
@@ -501,8 +501,8 @@ Definition and introduction
501501---------------------------
502502
503503In general, a descriptor is an attribute value that has one of the methods in
504- the descriptor protocol. Those methods are :meth: `__get__ `, :meth: `__set__ `,
505- and :meth: `__delete__ `. If any of those methods are defined for an
504+ the descriptor protocol. Those methods are :meth: `~object. __get__ `, :meth: `~object. __set__ `,
505+ and :meth: `~object. __delete__ `. If any of those methods are defined for an
506506attribute, it is said to be a :term: `descriptor `.
507507
508508The default behavior for attribute access is to get, set, or delete the
@@ -534,8 +534,8 @@ That is all there is to it. Define any of these methods and an object is
534534considered a descriptor and can override default behavior upon being looked up
535535as an attribute.
536536
537- If an object defines :meth: `__set__ ` or :meth: `__delete__ `, it is considered
538- a data descriptor. Descriptors that only define :meth: `__get__ ` are called
537+ If an object defines :meth: `~object. __set__ ` or :meth: `~object. __delete__ `, it is considered
538+ a data descriptor. Descriptors that only define :meth: `~object. __get__ ` are called
539539non-data descriptors (they are often used for methods but other uses are
540540possible).
541541
@@ -545,9 +545,9 @@ has an entry with the same name as a data descriptor, the data descriptor
545545takes precedence. If an instance's dictionary has an entry with the same
546546name as a non-data descriptor, the dictionary entry takes precedence.
547547
548- To make a read-only data descriptor, define both :meth: `__get__ ` and
549- :meth: `__set__ ` with the :meth: `__set__ ` raising an :exc: `AttributeError ` when
550- called. Defining the :meth: `__set__ ` method with an exception raising
548+ To make a read-only data descriptor, define both :meth: `~object. __get__ ` and
549+ :meth: `~object. __set__ ` with the :meth: `~object. __set__ ` raising an :exc: `AttributeError ` when
550+ called. Defining the :meth: `~object. __set__ ` method with an exception raising
551551placeholder is enough to make it a data descriptor.
552552
553553
@@ -574,7 +574,7 @@ Invocation from an instance
574574
575575Instance lookup scans through a chain of namespaces giving data descriptors
576576the highest priority, followed by instance variables, then non-data
577- descriptors, then class variables, and lastly :meth: `__getattr__ ` if it is
577+ descriptors, then class variables, and lastly :meth: `~object. __getattr__ ` if it is
578578provided.
579579
580580If a descriptor is found for ``a.x ``, then it is invoked with:
@@ -719,12 +719,12 @@ a pure Python equivalent:
719719 >>> object_getattribute(u2, ' x' ) == u2.x == (D1, u2, U2)
720720 True
721721
722- Note, there is no :meth: `__getattr__ ` hook in the :meth: `__getattribute__ `
723- code. That is why calling :meth: `__getattribute__ ` directly or with
724- ``super().__getattribute__ `` will bypass :meth: `__getattr__ ` entirely.
722+ Note, there is no :meth: `~object. __getattr__ ` hook in the :meth: `~object. __getattribute__ `
723+ code. That is why calling :meth: `~object. __getattribute__ ` directly or with
724+ ``super().__getattribute__ `` will bypass :meth: `~object. __getattr__ ` entirely.
725725
726726Instead, it is the dot operator and the :func: `getattr ` function that are
727- responsible for invoking :meth: `__getattr__ ` whenever :meth: `__getattribute__ `
727+ responsible for invoking :meth: `~object. __getattr__ ` whenever :meth: `~object. __getattribute__ `
728728raises an :exc: `AttributeError `. Their logic is encapsulated in a helper
729729function:
730730
@@ -776,8 +776,8 @@ Invocation from a class
776776-----------------------
777777
778778The logic for a dotted lookup such as ``A.x `` is in
779- :meth: `type.__getattribute__ `. The steps are similar to those for
780- :meth: `object.__getattribute__ ` but the instance dictionary lookup is replaced
779+ :meth: `! type.__getattribute__ `. The steps are similar to those for
780+ :meth: `! object.__getattribute__ ` but the instance dictionary lookup is replaced
781781by a search through the class's :term: `method resolution order `.
782782
783783If a descriptor is found, it is invoked with ``desc.__get__(None, A) ``.
@@ -789,7 +789,7 @@ The full C implementation can be found in :c:func:`!type_getattro` and
789789Invocation from super
790790---------------------
791791
792- The logic for super's dotted lookup is in the :meth: `__getattribute__ ` method for
792+ The logic for super's dotted lookup is in the :meth: `~object. __getattribute__ ` method for
793793object returned by :func: `super `.
794794
795795A dotted lookup such as ``super(A, obj).m `` searches ``obj.__class__.__mro__ ``
@@ -806,21 +806,21 @@ The full C implementation can be found in :c:func:`!super_getattro` in
806806Summary of invocation logic
807807---------------------------
808808
809- The mechanism for descriptors is embedded in the :meth: `__getattribute__ `
809+ The mechanism for descriptors is embedded in the :meth: `~object. __getattribute__ `
810810methods for :class: `object `, :class: `type `, and :func: `super `.
811811
812812The important points to remember are:
813813
814- * Descriptors are invoked by the :meth: `__getattribute__ ` method.
814+ * Descriptors are invoked by the :meth: `~object. __getattribute__ ` method.
815815
816816* Classes inherit this machinery from :class: `object `, :class: `type `, or
817817 :func: `super `.
818818
819- * Overriding :meth: `__getattribute__ ` prevents automatic descriptor calls
819+ * Overriding :meth: `~object. __getattribute__ ` prevents automatic descriptor calls
820820 because all the descriptor logic is in that method.
821821
822- * :meth: `object.__getattribute__ ` and :meth: `type.__getattribute__ ` make
823- different calls to :meth: `__get__ `. The first includes the instance and may
822+ * :meth: `! object.__getattribute__ ` and :meth: `! type.__getattribute__ ` make
823+ different calls to :meth: `~object. __get__ `. The first includes the instance and may
824824 include the class. The second puts in ``None `` for the instance and always
825825 includes the class.
826826
@@ -835,16 +835,16 @@ Automatic name notification
835835Sometimes it is desirable for a descriptor to know what class variable name it
836836was assigned to. When a new class is created, the :class: `type ` metaclass
837837scans the dictionary of the new class. If any of the entries are descriptors
838- and if they define :meth: `__set_name__ `, that method is called with two
838+ and if they define :meth: `~object. __set_name__ `, that method is called with two
839839arguments. The *owner * is the class where the descriptor is used, and the
840840*name * is the class variable the descriptor was assigned to.
841841
842842The implementation details are in :c:func: `!type_new ` and
843843:c:func: `!set_names ` in :source: `Objects/typeobject.c `.
844844
845- Since the update logic is in :meth: `type.__new__ `, notifications only take
845+ Since the update logic is in :meth: `! type.__new__ `, notifications only take
846846place at the time of class creation. If descriptors are added to the class
847- afterwards, :meth: `__set_name__ ` will need to be called manually.
847+ afterwards, :meth: `~object. __set_name__ ` will need to be called manually.
848848
849849
850850ORM example
@@ -873,7 +873,7 @@ care of lookups or updates:
873873 conn.execute(self.store, [value, obj.key])
874874 conn.commit()
875875
876- We can use the :class: `Field ` class to define `models
876+ We can use the :class: `! Field ` class to define `models
877877<https://en.wikipedia.org/wiki/Database_model> `_ that describe the schema for
878878each table in a database:
879879
@@ -1140,7 +1140,7 @@ to wrap access to the value attribute in a property data descriptor:
11401140 self.recalc()
11411141 return self._value
11421142
1143- Either the built-in :func: `property ` or our :func: `Property ` equivalent would
1143+ Either the built-in :func: `property ` or our :func: `! Property ` equivalent would
11441144work in this example.
11451145
11461146
@@ -1187,7 +1187,7 @@ roughly equivalent to:
11871187 return self
11881188
11891189To support automatic creation of methods, functions include the
1190- :meth: `__get__ ` method for binding methods during attribute access. This
1190+ :meth: `~object. __get__ ` method for binding methods during attribute access. This
11911191means that functions are non-data descriptors that return bound methods
11921192during dotted lookup from an instance. Here's how it works:
11931193
@@ -1231,19 +1231,19 @@ The function has a :term:`qualified name` attribute to support introspection:
12311231 'D.f'
12321232
12331233Accessing the function through the class dictionary does not invoke
1234- :meth: `__get__ `. Instead, it just returns the underlying function object::
1234+ :meth: `~object. __get__ `. Instead, it just returns the underlying function object::
12351235
12361236 >>> D.__dict__['f']
12371237 <function D.f at 0x00C45070>
12381238
1239- Dotted access from a class calls :meth: `__get__ ` which just returns the
1239+ Dotted access from a class calls :meth: `~object. __get__ ` which just returns the
12401240underlying function unchanged::
12411241
12421242 >>> D.f
12431243 <function D.f at 0x00C45070>
12441244
12451245The interesting behavior occurs during dotted access from an instance. The
1246- dotted lookup calls :meth: `__get__ ` which returns a bound method object::
1246+ dotted lookup calls :meth: `~object. __get__ ` which returns a bound method object::
12471247
12481248 >>> d = D()
12491249 >>> d.f
@@ -1268,7 +1268,7 @@ Kinds of methods
12681268Non-data descriptors provide a simple mechanism for variations on the usual
12691269patterns of binding functions into methods.
12701270
1271- To recap, functions have a :meth: `__get__ ` method so that they can be converted
1271+ To recap, functions have a :meth: `~object. __get__ ` method so that they can be converted
12721272to a method when accessed as attributes. The non-data descriptor transforms an
12731273``obj.f(*args) `` call into ``f(obj, *args) ``. Calling ``cls.f(*args) ``
12741274becomes ``f(*args) ``.
@@ -1671,7 +1671,7 @@ by member descriptors:
16711671 'Emulate member_repr() in Objects/descrobject.c'
16721672 return f'<Member {self.name!r} of {self.clsname!r}>'
16731673
1674- The :meth: `type.__new__ ` method takes care of adding member objects to class
1674+ The :meth: `! type.__new__ ` method takes care of adding member objects to class
16751675variables:
16761676
16771677.. testcode ::
@@ -1722,7 +1722,7 @@ Python:
17221722 )
17231723 super().__delattr__(name)
17241724
1725- To use the simulation in a real class, just inherit from :class: `Object ` and
1725+ To use the simulation in a real class, just inherit from :class: `! Object ` and
17261726set the :term: `metaclass ` to :class: `Type `:
17271727
17281728.. testcode ::
0 commit comments