forked from AFPy/python-docs-fr
472 lines
16 KiB
Plaintext
472 lines
16 KiB
Plaintext
# SOME DESCRIPTIVE TITLE.
|
|
# Copyright (C) 2001-2016, Python Software Foundation
|
|
# This file is distributed under the same license as the Python package.
|
|
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
|
#
|
|
#, fuzzy
|
|
msgid ""
|
|
msgstr ""
|
|
"Project-Id-Version: Python 3.6\n"
|
|
"Report-Msgid-Bugs-To: \n"
|
|
"POT-Creation-Date: 2017-04-02 22:11+0200\n"
|
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
|
"Language: fr\n"
|
|
"MIME-Version: 1.0\n"
|
|
"Content-Type: text/plain; charset=UTF-8\n"
|
|
"Content-Transfer-Encoding: 8bit\n"
|
|
|
|
#: ../Doc/howto/descriptor.rst:3
|
|
msgid "Descriptor HowTo Guide"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:5
|
|
msgid "Raymond Hettinger"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:6
|
|
msgid "<python at rcn dot com>"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:0
|
|
msgid "Contents"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:11
|
|
msgid "Abstract"
|
|
msgstr "Résumé"
|
|
|
|
#: ../Doc/howto/descriptor.rst:13
|
|
msgid ""
|
|
"Defines descriptors, summarizes the protocol, and shows how descriptors are "
|
|
"called. Examines a custom descriptor and several built-in python "
|
|
"descriptors including functions, properties, static methods, and class "
|
|
"methods. Shows how each works by giving a pure Python equivalent and a "
|
|
"sample application."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:18
|
|
msgid ""
|
|
"Learning about descriptors not only provides access to a larger toolset, it "
|
|
"creates a deeper understanding of how Python works and an appreciation for "
|
|
"the elegance of its design."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:24
|
|
msgid "Definition and Introduction"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:26
|
|
msgid ""
|
|
"In general, a descriptor is an object attribute with \"binding behavior\", "
|
|
"one whose attribute access has been overridden by methods in the descriptor "
|
|
"protocol. Those methods are :meth:`__get__`, :meth:`__set__`, and :meth:"
|
|
"`__delete__`. If any of those methods are defined for an object, it is said "
|
|
"to be a descriptor."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:32
|
|
msgid ""
|
|
"The default behavior for attribute access is to get, set, or delete the "
|
|
"attribute from an object's dictionary. For instance, ``a.x`` has a lookup "
|
|
"chain starting with ``a.__dict__['x']``, then ``type(a).__dict__['x']``, and "
|
|
"continuing through the base classes of ``type(a)`` excluding metaclasses. If "
|
|
"the looked-up value is an object defining one of the descriptor methods, "
|
|
"then Python may override the default behavior and invoke the descriptor "
|
|
"method instead. Where this occurs in the precedence chain depends on which "
|
|
"descriptor methods were defined."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:41
|
|
msgid ""
|
|
"Descriptors are a powerful, general purpose protocol. They are the "
|
|
"mechanism behind properties, methods, static methods, class methods, and :"
|
|
"func:`super()`. They are used throughout Python itself to implement the new "
|
|
"style classes introduced in version 2.2. Descriptors simplify the "
|
|
"underlying C-code and offer a flexible set of new tools for everyday Python "
|
|
"programs."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:49
|
|
msgid "Descriptor Protocol"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:51
|
|
msgid "``descr.__get__(self, obj, type=None) --> value``"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:53
|
|
msgid "``descr.__set__(self, obj, value) --> None``"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:55
|
|
msgid "``descr.__delete__(self, obj) --> None``"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:57
|
|
msgid ""
|
|
"That is all there is to it. Define any of these methods and an object is "
|
|
"considered a descriptor and can override default behavior upon being looked "
|
|
"up as an attribute."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:61
|
|
msgid ""
|
|
"If an object defines both :meth:`__get__` and :meth:`__set__`, it is "
|
|
"considered a data descriptor. Descriptors that only define :meth:`__get__` "
|
|
"are called non-data descriptors (they are typically used for methods but "
|
|
"other uses are possible)."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:66
|
|
msgid ""
|
|
"Data and non-data descriptors differ in how overrides are calculated with "
|
|
"respect to entries in an instance's dictionary. If an instance's dictionary "
|
|
"has an entry with the same name as a data descriptor, the data descriptor "
|
|
"takes precedence. If an instance's dictionary has an entry with the same "
|
|
"name as a non-data descriptor, the dictionary entry takes precedence."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:72
|
|
msgid ""
|
|
"To make a read-only data descriptor, define both :meth:`__get__` and :meth:"
|
|
"`__set__` with the :meth:`__set__` raising an :exc:`AttributeError` when "
|
|
"called. Defining the :meth:`__set__` method with an exception raising "
|
|
"placeholder is enough to make it a data descriptor."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:79
|
|
msgid "Invoking Descriptors"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:81
|
|
msgid ""
|
|
"A descriptor can be called directly by its method name. For example, ``d."
|
|
"__get__(obj)``."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:84
|
|
msgid ""
|
|
"Alternatively, it is more common for a descriptor to be invoked "
|
|
"automatically upon attribute access. For example, ``obj.d`` looks up ``d`` "
|
|
"in the dictionary of ``obj``. If ``d`` defines the method :meth:`__get__`, "
|
|
"then ``d.__get__(obj)`` is invoked according to the precedence rules listed "
|
|
"below."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:89
|
|
msgid ""
|
|
"The details of invocation depend on whether ``obj`` is an object or a class."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:91
|
|
msgid ""
|
|
"For objects, the machinery is in :meth:`object.__getattribute__` which "
|
|
"transforms ``b.x`` into ``type(b).__dict__['x'].__get__(b, type(b))``. The "
|
|
"implementation works through a precedence chain that gives data descriptors "
|
|
"priority over instance variables, instance variables priority over non-data "
|
|
"descriptors, and assigns lowest priority to :meth:`__getattr__` if provided. "
|
|
"The full C implementation can be found in :c:func:"
|
|
"`PyObject_GenericGetAttr()` in :source:`Objects/object.c`."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:99
|
|
msgid ""
|
|
"For classes, the machinery is in :meth:`type.__getattribute__` which "
|
|
"transforms ``B.x`` into ``B.__dict__['x'].__get__(None, B)``. In pure "
|
|
"Python, it looks like::"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:110
|
|
msgid "The important points to remember are:"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:112
|
|
msgid "descriptors are invoked by the :meth:`__getattribute__` method"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:113
|
|
msgid "overriding :meth:`__getattribute__` prevents automatic descriptor calls"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:114
|
|
msgid ""
|
|
":meth:`object.__getattribute__` and :meth:`type.__getattribute__` make "
|
|
"different calls to :meth:`__get__`."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:116
|
|
msgid "data descriptors always override instance dictionaries."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:117
|
|
msgid "non-data descriptors may be overridden by instance dictionaries."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:119
|
|
msgid ""
|
|
"The object returned by ``super()`` also has a custom :meth:"
|
|
"`__getattribute__` method for invoking descriptors. The call ``super(B, "
|
|
"obj).m()`` searches ``obj.__class__.__mro__`` for the base class ``A`` "
|
|
"immediately following ``B`` and then returns ``A.__dict__['m'].__get__(obj, "
|
|
"B)``. If not a descriptor, ``m`` is returned unchanged. If not in the "
|
|
"dictionary, ``m`` reverts to a search using :meth:`object.__getattribute__`."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:126
|
|
msgid ""
|
|
"The implementation details are in :c:func:`super_getattro()` in :source:"
|
|
"`Objects/typeobject.c`. and a pure Python equivalent can be found in "
|
|
"`Guido's Tutorial`_."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:132
|
|
msgid ""
|
|
"The details above show that the mechanism for descriptors is embedded in "
|
|
"the :meth:`__getattribute__()` methods for :class:`object`, :class:`type`, "
|
|
"and :func:`super`. Classes inherit this machinery when they derive from :"
|
|
"class:`object` or if they have a meta-class providing similar functionality. "
|
|
"Likewise, classes can turn-off descriptor invocation by overriding :meth:"
|
|
"`__getattribute__()`."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:141
|
|
msgid "Descriptor Example"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:143
|
|
msgid ""
|
|
"The following code creates a class whose objects are data descriptors which "
|
|
"print a message for each get or set. Overriding :meth:`__getattribute__` is "
|
|
"alternate approach that could do this for every attribute. However, this "
|
|
"descriptor is useful for monitoring just a few chosen attributes::"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:181
|
|
msgid ""
|
|
"The protocol is simple and offers exciting possibilities. Several use cases "
|
|
"are so common that they have been packaged into individual function calls. "
|
|
"Properties, bound and unbound methods, static methods, and class methods are "
|
|
"all based on the descriptor protocol."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:188
|
|
msgid "Properties"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:190
|
|
msgid ""
|
|
"Calling :func:`property` is a succinct way of building a data descriptor "
|
|
"that triggers function calls upon access to an attribute. Its signature is::"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:195
|
|
msgid ""
|
|
"The documentation shows a typical use to define a managed attribute ``x``::"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:203
|
|
msgid ""
|
|
"To see how :func:`property` is implemented in terms of the descriptor "
|
|
"protocol, here is a pure Python equivalent::"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:243
|
|
msgid ""
|
|
"The :func:`property` builtin helps whenever a user interface has granted "
|
|
"attribute access and then subsequent changes require the intervention of a "
|
|
"method."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:247
|
|
msgid ""
|
|
"For instance, a spreadsheet class may grant access to a cell value through "
|
|
"``Cell('b10').value``. Subsequent improvements to the program require the "
|
|
"cell to be recalculated on every access; however, the programmer does not "
|
|
"want to affect existing client code accessing the attribute directly. The "
|
|
"solution is to wrap access to the value attribute in a property data "
|
|
"descriptor::"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:263
|
|
msgid "Functions and Methods"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:265
|
|
msgid ""
|
|
"Python's object oriented features are built upon a function based "
|
|
"environment. Using non-data descriptors, the two are merged seamlessly."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:268
|
|
msgid ""
|
|
"Class dictionaries store methods as functions. In a class definition, "
|
|
"methods are written using :keyword:`def` and :keyword:`lambda`, the usual "
|
|
"tools for creating functions. The only difference from regular functions is "
|
|
"that the first argument is reserved for the object instance. By Python "
|
|
"convention, the instance reference is called *self* but may be called *this* "
|
|
"or any other variable name."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:275
|
|
msgid ""
|
|
"To support method calls, functions include the :meth:`__get__` method for "
|
|
"binding methods during attribute access. This means that all functions are "
|
|
"non-data descriptors which return bound or unbound methods depending whether "
|
|
"they are invoked from an object or a class. In pure python, it works like "
|
|
"this::"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:287
|
|
msgid ""
|
|
"Running the interpreter shows how the function descriptor works in practice::"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:301
|
|
msgid ""
|
|
"The output suggests that bound and unbound methods are two different types. "
|
|
"While they could have been implemented that way, the actual C implementation "
|
|
"of :c:type:`PyMethod_Type` in :source:`Objects/classobject.c` is a single "
|
|
"object with two different representations depending on whether the :attr:"
|
|
"`im_self` field is set or is *NULL* (the C equivalent of ``None``)."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:307
|
|
msgid ""
|
|
"Likewise, the effects of calling a method object depend on the :attr:"
|
|
"`im_self` field. If set (meaning bound), the original function (stored in "
|
|
"the :attr:`im_func` field) is called as expected with the first argument set "
|
|
"to the instance. If unbound, all of the arguments are passed unchanged to "
|
|
"the original function. The actual C implementation of :func:"
|
|
"`instancemethod_call()` is only slightly more complex in that it includes "
|
|
"some type checking."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:316
|
|
msgid "Static Methods and Class Methods"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:318
|
|
msgid ""
|
|
"Non-data descriptors provide a simple mechanism for variations on the usual "
|
|
"patterns of binding functions into methods."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:321
|
|
msgid ""
|
|
"To recap, functions have a :meth:`__get__` method so that they can be "
|
|
"converted to a method when accessed as attributes. The non-data descriptor "
|
|
"transforms an ``obj.f(*args)`` call into ``f(obj, *args)``. Calling ``klass."
|
|
"f(*args)`` becomes ``f(*args)``."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:326
|
|
msgid "This chart summarizes the binding and its two most useful variants:"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:329
|
|
msgid "Transformation"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:329
|
|
msgid "Called from an Object"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:329
|
|
msgid "Called from a Class"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:332
|
|
msgid "function"
|
|
msgstr "fonction"
|
|
|
|
#: ../Doc/howto/descriptor.rst:332
|
|
msgid "f(obj, \\*args)"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:332 ../Doc/howto/descriptor.rst:334
|
|
msgid "f(\\*args)"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:334
|
|
msgid "staticmethod"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:336
|
|
msgid "classmethod"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:336
|
|
msgid "f(type(obj), \\*args)"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:336
|
|
msgid "f(klass, \\*args)"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:339
|
|
msgid ""
|
|
"Static methods return the underlying function without changes. Calling "
|
|
"either ``c.f`` or ``C.f`` is the equivalent of a direct lookup into ``object."
|
|
"__getattribute__(c, \"f\")`` or ``object.__getattribute__(C, \"f\")``. As a "
|
|
"result, the function becomes identically accessible from either an object or "
|
|
"a class."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:345
|
|
msgid ""
|
|
"Good candidates for static methods are methods that do not reference the "
|
|
"``self`` variable."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:348
|
|
msgid ""
|
|
"For instance, a statistics package may include a container class for "
|
|
"experimental data. The class provides normal methods for computing the "
|
|
"average, mean, median, and other descriptive statistics that depend on the "
|
|
"data. However, there may be useful functions which are conceptually related "
|
|
"but do not depend on the data. For instance, ``erf(x)`` is handy conversion "
|
|
"routine that comes up in statistical work but does not directly depend on a "
|
|
"particular dataset. It can be called either from an object or the class: "
|
|
"``s.erf(1.5) --> .9332`` or ``Sample.erf(1.5) --> .9332``."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:357
|
|
msgid ""
|
|
"Since staticmethods return the underlying function with no changes, the "
|
|
"example calls are unexciting::"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:370
|
|
msgid ""
|
|
"Using the non-data descriptor protocol, a pure Python version of :func:"
|
|
"`staticmethod` would look like this::"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:382
|
|
msgid ""
|
|
"Unlike static methods, class methods prepend the class reference to the "
|
|
"argument list before calling the function. This format is the same for "
|
|
"whether the caller is an object or a class::"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:397
|
|
msgid ""
|
|
"This behavior is useful whenever the function only needs to have a class "
|
|
"reference and does not care about any underlying data. One use for "
|
|
"classmethods is to create alternate class constructors. In Python 2.3, the "
|
|
"classmethod :func:`dict.fromkeys` creates a new dictionary from a list of "
|
|
"keys. The pure Python equivalent is::"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:413
|
|
msgid "Now a new dictionary of unique keys can be constructed like this::"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/descriptor.rst:418
|
|
msgid ""
|
|
"Using the non-data descriptor protocol, a pure Python version of :func:"
|
|
"`classmethod` would look like this::"
|
|
msgstr ""
|