@@ -42,7 +42,7 @@ add new capabilities one by one.
42
42
Simple example: A descriptor that returns a constant
43
43
----------------------------------------------------
44
44
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
46
46
returns the constant ``10 ``:
47
47
48
48
.. testcode ::
@@ -120,10 +120,10 @@ different, updated answers each time::
120
120
2
121
121
122
122
Besides 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 *
124
124
parameter is *size *, an instance of *DirectorySize *. The *obj * parameter is
125
125
either *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 *
127
127
parameter is the class *Directory *.
128
128
129
129
@@ -133,7 +133,7 @@ Managed attributes
133
133
A popular use for descriptors is managing access to instance data. The
134
134
descriptor is assigned to a public attribute in the class dictionary while the
135
135
actual 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
137
137
the public attribute is accessed.
138
138
139
139
In the following example, *age * is the public attribute and *_age * is the
@@ -215,9 +215,9 @@ Customized names
215
215
When a class uses descriptors, it can inform each descriptor about which
216
216
variable name was used.
217
217
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
221
221
be recorded, giving each descriptor its own *public_name * and *private_name *:
222
222
223
223
.. testcode ::
@@ -253,8 +253,8 @@ be recorded, giving each descriptor its own *public_name* and *private_name*:
253
253
def birthday(self):
254
254
self.age += 1
255
255
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
258
258
we call :func: `vars ` to look up the descriptor without triggering it:
259
259
260
260
.. doctest ::
@@ -294,10 +294,10 @@ The two *Person* instances contain only the private names:
294
294
Closing thoughts
295
295
----------------
296
296
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__ `.
299
299
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
301
301
used in cases where a descriptor needs to know either the class where it was
302
302
created or the name of class variable it was assigned to. (This method, if
303
303
present, 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
337
337
restrictions. If those restrictions aren't met, it raises an exception to
338
338
prevent data corruption at its source.
339
339
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
341
341
managed attribute descriptor:
342
342
343
343
.. testcode ::
@@ -360,22 +360,22 @@ managed attribute descriptor:
360
360
def validate(self, value):
361
361
pass
362
362
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.
365
365
366
366
367
367
Custom validators
368
368
-----------------
369
369
370
370
Here are three practical data validation utilities:
371
371
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.
373
373
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
375
375
:class: `float `. Optionally, it verifies that a value is between a given
376
376
minimum or maximum.
377
377
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
379
379
validates a given minimum or maximum length. It can validate a
380
380
user-defined `predicate
381
381
<https://en.wikipedia.org/wiki/Predicate_(mathematical_logic)> `_ as well.
@@ -501,8 +501,8 @@ Definition and introduction
501
501
---------------------------
502
502
503
503
In 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
506
506
attribute, it is said to be a :term: `descriptor `.
507
507
508
508
The 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
534
534
considered a descriptor and can override default behavior upon being looked up
535
535
as an attribute.
536
536
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
539
539
non-data descriptors (they are often used for methods but other uses are
540
540
possible).
541
541
@@ -545,9 +545,9 @@ has an entry with the same name as a data descriptor, the data descriptor
545
545
takes precedence. If an instance's dictionary has an entry with the same
546
546
name as a non-data descriptor, the dictionary entry takes precedence.
547
547
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
551
551
placeholder is enough to make it a data descriptor.
552
552
553
553
@@ -574,7 +574,7 @@ Invocation from an instance
574
574
575
575
Instance lookup scans through a chain of namespaces giving data descriptors
576
576
the 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
578
578
provided.
579
579
580
580
If a descriptor is found for ``a.x ``, then it is invoked with:
@@ -719,12 +719,12 @@ a pure Python equivalent:
719
719
>>> object_getattribute(u2, ' x' ) == u2.x == (D1, u2, U2)
720
720
True
721
721
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.
725
725
726
726
Instead, 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__ `
728
728
raises an :exc: `AttributeError `. Their logic is encapsulated in a helper
729
729
function:
730
730
@@ -776,8 +776,8 @@ Invocation from a class
776
776
-----------------------
777
777
778
778
The 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
781
781
by a search through the class's :term: `method resolution order `.
782
782
783
783
If 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
789
789
Invocation from super
790
790
---------------------
791
791
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
793
793
object returned by :func: `super `.
794
794
795
795
A 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
806
806
Summary of invocation logic
807
807
---------------------------
808
808
809
- The mechanism for descriptors is embedded in the :meth: `__getattribute__ `
809
+ The mechanism for descriptors is embedded in the :meth: `~object. __getattribute__ `
810
810
methods for :class: `object `, :class: `type `, and :func: `super `.
811
811
812
812
The important points to remember are:
813
813
814
- * Descriptors are invoked by the :meth: `__getattribute__ ` method.
814
+ * Descriptors are invoked by the :meth: `~object. __getattribute__ ` method.
815
815
816
816
* Classes inherit this machinery from :class: `object `, :class: `type `, or
817
817
:func: `super `.
818
818
819
- * Overriding :meth: `__getattribute__ ` prevents automatic descriptor calls
819
+ * Overriding :meth: `~object. __getattribute__ ` prevents automatic descriptor calls
820
820
because all the descriptor logic is in that method.
821
821
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
824
824
include the class. The second puts in ``None `` for the instance and always
825
825
includes the class.
826
826
@@ -835,16 +835,16 @@ Automatic name notification
835
835
Sometimes it is desirable for a descriptor to know what class variable name it
836
836
was assigned to. When a new class is created, the :class: `type ` metaclass
837
837
scans 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
839
839
arguments. The *owner * is the class where the descriptor is used, and the
840
840
*name * is the class variable the descriptor was assigned to.
841
841
842
842
The implementation details are in :c:func: `!type_new ` and
843
843
:c:func: `!set_names ` in :source: `Objects/typeobject.c `.
844
844
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
846
846
place 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.
848
848
849
849
850
850
ORM example
@@ -873,7 +873,7 @@ care of lookups or updates:
873
873
conn.execute(self.store, [value, obj.key])
874
874
conn.commit()
875
875
876
- We can use the :class: `Field ` class to define `models
876
+ We can use the :class: `! Field ` class to define `models
877
877
<https://en.wikipedia.org/wiki/Database_model> `_ that describe the schema for
878
878
each table in a database:
879
879
@@ -1140,7 +1140,7 @@ to wrap access to the value attribute in a property data descriptor:
1140
1140
self.recalc()
1141
1141
return self._value
1142
1142
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
1144
1144
work in this example.
1145
1145
1146
1146
@@ -1187,7 +1187,7 @@ roughly equivalent to:
1187
1187
return self
1188
1188
1189
1189
To 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
1191
1191
means that functions are non-data descriptors that return bound methods
1192
1192
during dotted lookup from an instance. Here's how it works:
1193
1193
@@ -1231,19 +1231,19 @@ The function has a :term:`qualified name` attribute to support introspection:
1231
1231
'D.f'
1232
1232
1233
1233
Accessing 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::
1235
1235
1236
1236
>>> D.__dict__['f']
1237
1237
<function D.f at 0x00C45070>
1238
1238
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
1240
1240
underlying function unchanged::
1241
1241
1242
1242
>>> D.f
1243
1243
<function D.f at 0x00C45070>
1244
1244
1245
1245
The 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::
1247
1247
1248
1248
>>> d = D()
1249
1249
>>> d.f
@@ -1268,7 +1268,7 @@ Kinds of methods
1268
1268
Non-data descriptors provide a simple mechanism for variations on the usual
1269
1269
patterns of binding functions into methods.
1270
1270
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
1272
1272
to a method when accessed as attributes. The non-data descriptor transforms an
1273
1273
``obj.f(*args) `` call into ``f(obj, *args) ``. Calling ``cls.f(*args) ``
1274
1274
becomes ``f(*args) ``.
@@ -1667,7 +1667,7 @@ by member descriptors:
1667
1667
'Emulate member_repr() in Objects/descrobject.c'
1668
1668
return f'<Member {self.name!r} of {self.clsname!r}>'
1669
1669
1670
- The :meth: `type.__new__ ` method takes care of adding member objects to class
1670
+ The :meth: `! type.__new__ ` method takes care of adding member objects to class
1671
1671
variables:
1672
1672
1673
1673
.. testcode ::
@@ -1718,7 +1718,7 @@ Python:
1718
1718
)
1719
1719
super().__delattr__(name)
1720
1720
1721
- To use the simulation in a real class, just inherit from :class: `Object ` and
1721
+ To use the simulation in a real class, just inherit from :class: `! Object ` and
1722
1722
set the :term: `metaclass ` to :class: `Type `:
1723
1723
1724
1724
.. testcode ::
0 commit comments