3. Modèle de données
********************


3.1. Objets, valeurs et types
=============================

En Python, les données sont représentées sous forme *d’objets*. Toutes
les données d’un programme Python sont représentées par des objets ou
par des relations entre les objets (dans un certain sens, et en
conformité avec le modèle de Von Neumann « d’ordinateur à programme
enregistré », le code est aussi représenté par des objets).

Every object has an identity, a type and a value.  An object’s
*identity* never changes once it has been created; you may think of it
as the object’s address in memory.  The “"is"” operator compares the
identity of two objects; the "id()" function returns an integer
representing its identity (currently implemented as its address). An
object’s *type* is also unchangeable. [1] An object’s type determines
the operations that the object supports (e.g., « does it have a
length? ») and also defines the possible values for objects of that
type.  The "type()" function returns an object’s type (which is an
object itself).  The *value* of some objects can change.  Objects
whose value can change are said to be *mutable*; objects whose value
is unchangeable once they are created are called *immutable*. (The
value of an immutable container object that contains a reference to a
mutable object can change when the latter’s value is changed; however
the container is still considered immutable, because the collection of
objects it contains cannot be changed.  So, immutability is not
strictly the same as having an unchangeable value, it is more subtle.)
An object’s mutability is determined by its type; for instance,
numbers, strings and tuples are immutable, while dictionaries and
lists are mutable.

Un objet n’est jamais explicitement détruit ; cependant, lorsqu’il ne
peut plus être atteint, il a vocation à être supprimé par le ramasse-
miettes (*garbage-collector* en anglais). L’implémentation peut
retarder cette opération ou même ne pas la faire du tout — la façon
dont fonctionne le ramasse-miette est particulière à chaque
implémentation, l’important étant qu’il ne supprime pas d’objet qui
peut encore être atteint.

**CPython implementation detail:** CPython currently uses a reference-
counting scheme with (optional) delayed detection of cyclically linked
garbage, which collects most objects as soon as they become
unreachable, but is not guaranteed to collect garbage containing
circular references.  See the documentation of the "gc" module for
information on controlling the collection of cyclic garbage. Other
implementations act differently and CPython may change. Do not depend
on immediate finalization of objects when they become unreachable (ex:
always close files).

Notez que si vous utilisez les fonctionnalités de débogage ou de trace
de l’implémentation, il est possible que des références qui seraient
normalement supprimées soient toujours présentes. Notez aussi que
capturer une exception avec l’instruction "try"…"except" peut
conserver des objets en vie.

Some objects contain references to « external » resources such as open
files or windows.  It is understood that these resources are freed
when the object is garbage-collected, but since garbage collection is
not guaranteed to happen, such objects also provide an explicit way to
release the external resource, usually a "close()" method. Programs
are strongly recommended to explicitly close such objects.  The
“"try"…"finally"” statement provides a convenient way to do this.

Certains objets contiennent des références à d’autres objets ; on les
appelle *conteneurs*. Comme exemples de conteneurs, nous pouvons citer
les tuples, les listes et les dictionnaires. Les références sont
parties intégrantes de la valeur d’un conteneur. Dans la plupart des
cas, lorsque nous parlons de la valeur d’un conteneur, nous parlons
des valeurs, pas des identifiants des objets contenus ; cependant,
lorsque nous parlons de la muabilité d’un conteneur, seuls les
identifiants des objets immédiatement contenus sont concernés. Ainsi,
si un conteneur immuable (comme un tuple) contient une référence à un
objet muable, sa valeur change si cet objet muable est modifié.

Presque tous les comportements d’un objet dépendent du type de
l’objet. Même son identifiant est concerné dans un certain sens : pour
les types immuables, les opérations qui calculent de nouvelles valeurs
peuvent en fait renvoyer une référence à n’importe quel objet existant
avec le même type et la même valeur, alors que pour les objets muables
cela n’est pas autorisé. Par exemple, après "a = 1 ; b = 1", "a" et
"b" peuvent ou non se référer au même objet avec la valeur un, en
fonction de l’implémentation. Mais après "c = [] ; d = []", il est
garanti que "c" et "d" font référence à deux listes vides distinctes
nouvellement créées. Notez que "c = d = []" attribue le même objet à
"c" et "d".


3.2. Hiérarchie des types standards
===================================

Below is a list of the types that are built into Python.  Extension
modules (written in C, Java, or other languages, depending on the
implementation) can define additional types.  Future versions of
Python may add types to the type hierarchy (e.g., rational numbers,
efficiently stored arrays of integers, etc.).

Quelques descriptions des types ci-dessous contiennent un paragraphe
listant des « attributs spéciaux ». Ces attributs donnent accès à
l’implémentation et n’ont, en général, pas vocation à être utilisés.
Leur définition peut changer dans le futur.

*None*
   Ce type ne possède qu’une seule valeur. Il n’existe qu’un seul
   objet avec cette valeur. Vous accédez à cet objet avec le nom natif
   "None". Il est utilisé pour signifier l’absence de valeur dans de
   nombreux cas, par exemple pour des fonctions qui ne retournent rien
   explicitement. Sa valeur booléenne est fausse.

NotImplemented
   This type has a single value.  There is a single object with this
   value. This object is accessed through the built-in name
   "NotImplemented". Numeric methods and rich comparison methods may
   return this value if they do not implement the operation for the
   operands provided.  (The interpreter will then try the reflected
   operation, or some other fallback, depending on the operator.)  Its
   truth value is true.

Ellipse
   This type has a single value.  There is a single object with this
   value. This object is accessed through the built-in name
   "Ellipsis". It is used to indicate the presence of the "..." syntax
   in a slice.  Its truth value is true.

"numbers.Number"
   Ces objets sont créés par les littéraux numériques et renvoyés en
   tant que résultats par les opérateurs et les fonctions
   arithmétiques natives. Les objets numériques sont immuables ; une
   fois créés, leur valeur ne change pas. Les nombres Python sont bien
   sûr très fortement corrélés aux nombres mathématiques mais ils sont
   soumis aux limitations des représentations numériques par les
   ordinateurs.

   Python distingue les entiers, les nombres à virgule flottante et
   les nombres complexes :

   "numbers.Integral"
      Ils représentent des éléments de l’ensemble mathématique des
      entiers (positifs ou négatifs).

      There are three types of integers:

      Plain integers
         These represent numbers in the range -2147483648 through
         2147483647. (The range may be larger on machines with a
         larger natural word size, but not smaller.)  When the result
         of an operation would fall outside this range, the result is
         normally returned as a long integer (in some cases, the
         exception "OverflowError" is raised instead).  For the
         purpose of shift and mask operations, integers are assumed to
         have a binary, 2’s complement notation using 32 or more bits,
         and hiding no bits from the user (i.e., all 4294967296
         different bit patterns correspond to different values).

      Long integers
         Ils représentent les nombres, sans limite de taille, sous
         réserve de pouvoir être stockés en mémoire (virtuelle). Afin
         de pouvoir effectuer des décalages et appliquer des masques,
         on considère qu’ils ont une représentation binaire. Les
         nombres négatifs sont représentés comme une variante du
         complément à 2, qui donne l’illusion d’une chaîne infinie de
         bits de signe s’étendant vers la gauche.

      Booleans
         These represent the truth values False and True.  The two
         objects representing the values "False" and "True" are the
         only Boolean objects. The Boolean type is a subtype of plain
         integers, and Boolean values behave like the values 0 and 1,
         respectively, in almost all contexts, the exception being
         that when converted to a string, the strings ""False"" or
         ""True"" are returned, respectively.

      The rules for integer representation are intended to give the
      most meaningful interpretation of shift and mask operations
      involving negative integers and the least surprises when
      switching between the plain and long integer domains.  Any
      operation, if it yields a result in the plain integer domain,
      will yield the same result in the long integer domain or when
      using mixed operands.  The switch between domains is transparent
      to the programmer.

   "numbers.Real" ("float")
      Ils représentent les nombres à virgule flottante en double
      précision, tels que manipulés directement par la machine. Vous
      dépendez donc de l’architecture machine sous-jacente (et de
      l’implémentation C ou Java) pour les intervalles gérés et le
      traitement des débordements. Python ne gère pas les nombres à
      virgule flottante en précision simple ; les gains en puissance
      de calcul et mémoire, qui sont généralement la raison de
      l’utilisation des nombres en simple précision, sont annihilés
      par le fait que Python encapsule de toute façon ces nombres dans
      des objets. Il n’y a donc aucune raison de compliquer le langage
      avec deux types de nombres à virgule flottante.

   "numbers.Complex"
      Ils représentent les nombres complexes, sous la forme d’un
      couple de nombres à virgule flottante en double précision, tels
      que manipulés directement par la machine. Les mêmes restrictions
      s’appliquent que pour les nombres à virgule flottante. La partie
      réelle et la partie imaginaire d’un nombre complexe "z" peuvent
      être demandées par les attributs en lecture seule "z.real" et
      "z.imag".

Séquences
   Ils représentent des ensembles de taille finie indicés par des
   entiers positifs ou nuls. La fonction native "len()" renvoie le
   nombre d’éléments de la séquence. Quand la longueur d’une séquence
   est *n*, l’ensemble des indices contient les entiers 0, 1 …, *n-1*.
   On accède à l’élément d’indice *i* de la séquence *a* par "a[i]".

   Les séquences peuvent aussi être découpées en tranches (*slicing*
   en anglais) : "a[i:j]" sélectionne tous les éléments d’indice *k*
   tel que *i* "<=" *k* "<" *j*. Quand on l’utilise dans une
   expression, la tranche est du même type que la séquence. Ceci veut
   dire que l’ensemble des indices de la tranche est renuméroté de
   manière à partir de 0.

   Quelques séquences gèrent le « découpage étendu » (*extended
   slicing* en anglais) avec un troisième paramètre : "a[i:j:k]"
   sélectionne tous les éléments de *a* d’indice *x* où "x = i + n*k",
   avec *n* ">=" "0" et *i* "<=" *x* "<" *j*.

   Les séquences se différencient en fonction de leur muabilité :

   Séquences immuables
      Un objet de type de séquence immuable ne peut pas être modifié
      une fois qu’il a été créé. Si l’objet contient des références à
      d’autres objets, ces autres objets peuvent être muables et
      peuvent être modifiés ; cependant, les objets directement
      référencés par un objet immuable ne peuvent pas être modifiés.

      Les types suivants sont des séquences immuables :

      Chaînes de caractères
         The items of a string are characters.  There is no separate
         character type; a character is represented by a string of one
         item. Characters represent (at least) 8-bit bytes.  The
         built-in functions "chr()" and "ord()" convert between
         characters and nonnegative integers representing the byte
         values.  Bytes with the values 0–127 usually represent the
         corresponding ASCII values, but the interpretation of values
         is up to the program.  The string data type is also used to
         represent arrays of bytes, e.g., to hold data read from a
         file.

         (On systems whose native character set is not ASCII, strings
         may use EBCDIC in their internal representation, provided the
         functions "chr()" and "ord()" implement a mapping between
         ASCII and EBCDIC, and string comparison preserves the ASCII
         order. Or perhaps someone can propose a better rule?)

      Unicode
         The items of a Unicode object are Unicode code units.  A
         Unicode code unit is represented by a Unicode object of one
         item and can hold either a 16-bit or 32-bit value
         representing a Unicode ordinal (the maximum value for the
         ordinal is given in "sys.maxunicode", and depends on how
         Python is configured at compile time).  Surrogate pairs may
         be present in the Unicode object, and will be reported as two
         separate items.  The built-in functions "unichr()" and
         "ord()" convert between code units and nonnegative integers
         representing the Unicode ordinals as defined in the Unicode
         Standard 3.0. Conversion from and to other encodings are
         possible through the Unicode method "encode()" and the built-
         in function "unicode()".

      Tuples
         Les éléments d’un tuple sont n’importe quels objets Python.
         Les tuples de deux ou plus éléments sont formés par une liste
         d’expressions dont les éléments sont séparés par des
         virgules. Un tuple composé d’un seul élément (un « singleton
         ») est formé en suffixant une expression avec une virgule
         (une expression en tant que telle ne crée pas un tuple car
         les parenthèses doivent rester disponibles pour grouper les
         expressions). Un tuple vide peut être formé à l’aide d’une
         paire de parenthèses vide.

   Séquences muables
      Les séquences muables peuvent être modifiées après leur
      création. Les notations de tranches et de sous-ensembles peuvent
      être utilisées en tant que cibles d’une assignation ou de
      l’instruction "del" (suppression).

      Il existe aujourd’hui deux types intrinsèques de séquences
      muables :

      Listes
         N’importe quel objet Python peut être élément d’une liste.
         Les listes sont créées en plaçant entre crochets une liste
         d’expressions dont les éléments sont séparés par des virgules
         (notez que les listes de longueur 0 ou 1 ne sont pas des cas
         particuliers).

      Tableaux d’octets
         A bytearray object is a mutable array. They are created by
         the built-in "bytearray()" constructor.  Aside from being
         mutable (and hence unhashable), byte arrays otherwise provide
         the same interface and functionality as immutable bytes
         objects.

      The extension module "array" provides an additional example of a
      mutable sequence type.

Ensembles
   Ils représentent les ensembles d’objets, non ordonnés, finis et
   dont les éléments sont uniques. Tels quels, ils ne peuvent pas être
   indicés. Cependant, il est possible d’itérer dessus et la fonction
   native "len()" renvoie le nombre d’éléments de l’ensemble. Les
   utilisations classiques des ensembles sont les tests d’appartenance
   rapides, la suppression de doublons dans une séquence et le calcul
   d’opérations mathématiques telles que l’intersection, l’union, la
   différence et le complémentaire.

   Pour les éléments des ensembles, les mêmes règles concernant
   l’immuabilité s’appliquent que pour les clés de dictionnaires.
   Notez que les types numériques obéissent aux règles normales pour
   les comparaisons numériques : si deux nombres sont égaux (pour
   l’opération de comparaison, par exemple "1" et "1.0"), un seul
   élément est conservé dans l’ensemble.

   Actuellement, il existe deux types d’ensembles natifs :

   Ensembles
      Ils représentent les ensembles muables. Un ensemble est créé par
      la fonction native constructeur "set()" et peut être modifié par
      la suite à l’aide de différentes méthodes, par exemple "add()".

   Ensembles gelés
      Ils représentent les ensembles immuables. Ils sont créés par la
      fonction native constructeur "frozenset()". Comme un ensemble
      gelé est immuable et *hachable*, il peut être utilisé comme
      élément d’un autre ensemble ou comme clé de dictionnaire.

Tableaux de correspondances
   Ils représentent les ensembles finis d’objets indicés par des
   ensembles index arbitraires. La notation "a[k]" sélectionne
   l’élément indicé par "k" dans le tableau de correspondance "a" ;
   elle peut être utilisée dans des expressions, comme cible d’une
   assignation ou avec l’instruction "del". La fonction native "len()"
   renvoie le nombre d’éléments du tableau de correspondances.

   Il n’existe actuellement qu’un seul type natif pour les tableaux de
   correspondances :

   Dictionnaires
      Ils représentent les ensembles finis d’objets indicés par des
      valeurs presque arbitraires. Les seuls types de valeurs non
      reconnus comme clés sont les valeurs contenant des listes, des
      dictionnaires ou les autres types muables qui sont comparés par
      valeur plutôt que par l’identifiant de l’objet. La raison de
      cette limitation est qu’une implémentation efficace de
      dictionnaire requiert que l’empreinte par hachage des clés reste
      constante dans le temps. Les types numériques obéissent aux
      règles normales pour les comparaisons numériques : si deux
      nombres sont égaux pour l’opération de comparaison, par exemple
      "1" et "1.0", alors ces deux nombres peuvent être utilisés
      indifféremment pour désigner la même entrée du dictionnaire.

      Les dictionnaires sont muables : ils peuvent être créés par la
      notation "{...}" (reportez-vous à la section Agencements de
      dictionnaires).

      The extension modules "dbm", "gdbm", and "bsddb" provide
      additional examples of mapping types.

Types appelables
   Ce sont les types sur lesquels on peut faire un appel de fonction
   (lisez la section Appels) :

   Fonctions allogènes
      Un objet fonction allogène (ou fonction définie par
      l’utilisateur, mais ce n’est pas forcément l’utilisateur courant
      qui a défini cette fonction) est créé par la définition d’une
      fonction (voir la section Définition de fonctions). Il doit être
      appelé avec une liste d’arguments contenant le même nombre
      d’éléments que la liste des paramètres formels de la fonction.

      Attributs spéciaux :

      +-------------------------+---------------------------------+-------------+
      | Attribut                | Signification                   |             |
      +=========================+=================================+=============+
      | "__doc__" "func_doc"    | The function’s documentation    | Accessible  |
      |                         | string, or "None" if            | en écriture |
      |                         | unavailable.                    |             |
      +-------------------------+---------------------------------+-------------+
      | "__name__" "func_name"  | Nom de la fonction              | Accessible  |
      |                         |                                 | en écriture |
      +-------------------------+---------------------------------+-------------+
      | "__module__"            | Nom du module où la fonction    | Accessible  |
      |                         | est définie ou "None" si ce nom | en écriture |
      |                         | n’est pas disponible.           |             |
      +-------------------------+---------------------------------+-------------+
      | "__defaults__"          | A tuple containing default      | Accessible  |
      | "func_defaults"         | argument values for those       | en écriture |
      |                         | arguments that have defaults,   |             |
      |                         | or "None" if no arguments have  |             |
      |                         | a default value.                |             |
      +-------------------------+---------------------------------+-------------+
      | "__code__" "func_code"  | Objet code représentant le      | Accessible  |
      |                         | corps de la fonction compilée.  | en écriture |
      +-------------------------+---------------------------------+-------------+
      | "__globals__"           | Référence pointant vers le      | Accessible  |
      | "func_globals"          | dictionnaire contenant les      | en lecture  |
      |                         | variables globales de la        | seule       |
      |                         | fonction – l’espace de noms     |             |
      |                         | global du module dans lequel la |             |
      |                         | fonction est définie.           |             |
      +-------------------------+---------------------------------+-------------+
      | "__dict__" "func_dict"  | Espace de noms accueillant les  | Accessible  |
      |                         | attributs de la fonction.       | en écriture |
      +-------------------------+---------------------------------+-------------+
      | "__closure__"           | "None" ou tuple de cellules qui | Accessible  |
      | "func_closure"          | contient un lien pour chaque    | en lecture  |
      |                         | variable libre de la fonction.  | seule       |
      +-------------------------+---------------------------------+-------------+

      La plupart des attributs étiquetés « Accessible en écriture »
      vérifient le type de la valeur qu’on leur assigne.

      Modifié dans la version 2.4: "func_name" is now writable.

      Modifié dans la version 2.6: The double-underscore attributes
      "__closure__", "__code__", "__defaults__", and "__globals__"
      were introduced as aliases for the corresponding "func_*"
      attributes for forwards compatibility with Python 3.

      Les objets fonctions acceptent également l’assignation et la
      lecture d’attributs arbitraires. Vous pouvez utiliser cette
      fonctionnalité pour, par exemple, associer des métadonnées aux
      fonctions. La notation classique par point est utilisée pour
      définir et lire de tels attributs. *Notez que l’implémentation
      actuelle accepte seulement les attributs de fonction sur les
      fonctions définies par l’utilisateur. Les attributs de fonction
      pour les fonctions natives seront peut-être acceptés dans le
      futur.*

      Vous trouvez davantage d’informations sur la définition de
      fonctions dans le code de cet objet ; la description des types
      internes est donnée plus bas.

   User-defined methods
      A user-defined method object combines a class, a class instance
      (or "None") and any callable object (normally a user-defined
      function).

      Special read-only attributes: "im_self" is the class instance
      object, "im_func" is the function object; "im_class" is the
      class of "im_self" for bound methods or the class that asked for
      the method for unbound methods; "__doc__" is the method’s
      documentation (same as "im_func.__doc__"); "__name__" is the
      method name (same as "im_func.__name__"); "__module__" is the
      name of the module the method was defined in, or "None" if
      unavailable.

      Modifié dans la version 2.2: "im_self" used to refer to the
      class that defined the method.

      Modifié dans la version 2.6: For Python 3 forward-compatibility,
      "im_func" is also available as "__func__", and "im_self" as
      "__self__".

      Les méthodes savent aussi accéder (mais pas modifier) les
      attributs de la fonction de l’objet fonction sous-jacent.

      User-defined method objects may be created when getting an
      attribute of a class (perhaps via an instance of that class), if
      that attribute is a user-defined function object, an unbound
      user-defined method object, or a class method object. When the
      attribute is a user-defined method object, a new method object
      is only created if the class from which it is being retrieved is
      the same as, or a derived class of, the class stored in the
      original method object; otherwise, the original method object is
      used as it is.

      When a user-defined method object is created by retrieving a
      user-defined function object from a class, its "im_self"
      attribute is "None" and the method object is said to be unbound.
      When one is created by retrieving a user-defined function object
      from a class via one of its instances, its "im_self" attribute
      is the instance, and the method object is said to be bound. In
      either case, the new method’s "im_class" attribute is the class
      from which the retrieval takes place, and its "im_func"
      attribute is the original function object.

      When a user-defined method object is created by retrieving
      another method object from a class or instance, the behaviour is
      the same as for a function object, except that the "im_func"
      attribute of the new instance is not the original method object
      but its "im_func" attribute.

      When a user-defined method object is created by retrieving a
      class method object from a class or instance, its "im_self"
      attribute is the class itself, and its "im_func" attribute is
      the function object underlying the class method.

      When an unbound user-defined method object is called, the
      underlying function ("im_func") is called, with the restriction
      that the first argument must be an instance of the proper class
      ("im_class") or of a derived class thereof.

      When a bound user-defined method object is called, the
      underlying function ("im_func") is called, inserting the class
      instance ("im_self") in front of the argument list.  For
      instance, when "C" is a class which contains a definition for a
      function "f()", and "x" is an instance of "C", calling "x.f(1)"
      is equivalent to calling "C.f(x, 1)".

      When a user-defined method object is derived from a class method
      object, the « class instance » stored in "im_self" will actually
      be the class itself, so that calling either "x.f(1)" or "C.f(1)"
      is equivalent to calling "f(C,1)" where "f" is the underlying
      function.

      Note that the transformation from function object to (unbound or
      bound) method object happens each time the attribute is
      retrieved from the class or instance. In some cases, a fruitful
      optimization is to assign the attribute to a local variable and
      call that local variable. Also notice that this transformation
      only happens for user-defined functions; other callable objects
      (and all non-callable objects) are retrieved without
      transformation.  It is also important to note that user-defined
      functions which are attributes of a class instance are not
      converted to bound methods; this *only* happens when the
      function is an attribute of the class.

   Fonctions générateurs
      A function or method which uses the "yield" statement (see
      section L’instruction yield) is called a *generator function*.
      Such a function, when called, always returns an iterator object
      which can be used to execute the body of the function:  calling
      the iterator’s "next()" method will cause the function to
      execute until it provides a value using the "yield" statement.
      When the function executes a "return" statement or falls off the
      end, a "StopIteration" exception is raised and the iterator will
      have reached the end of the set of values to be returned.

   Fonctions natives
      Un objet fonction native est une enveloppe autour d’une fonction
      C. Nous pouvons citer "len()" et "math.sin()" ("math" est un
      module standard natif) comme fonctions natives. Le nombre et le
      type des arguments sont déterminés par la fonction C. Des
      attributs spéciaux en lecture seule existent : "__doc__"
      contient la chaîne de documentation de la fonction (ou "None"
      s’il n’y en a pas) ; "__name__" est le nom de la fonction ;
      "__self__" est défini à "None" ; "__module__" est le nom du
      module où la fonction est définie ou "None" s’il n’est pas
      disponible.

   Méthodes natives
      Ce sont des fonctions natives déguisées, contenant un objet
      passé à une fonction C en tant qu’argument supplémentaire
      implicite. Un exemple de méthode native est "une_liste.append()"
      (une_liste étant un objet liste). Dans ce cas, l’attribut
      spécial en lecture seule "__self__" est défini à l’objet
      *une_liste*.

   Class Types
      Class types, or « new-style classes, » are callable.  These
      objects normally act as factories for new instances of
      themselves, but variations are possible for class types that
      override "__new__()".  The arguments of the call are passed to
      "__new__()" and, in the typical case, to "__init__()" to
      initialize the new instance.

   Classic Classes
      Class objects are described below.  When a class object is
      called, a new class instance (also described below) is created
      and returned.  This implies a call to the class’s "__init__()"
      method if it has one.  Any arguments are passed on to the
      "__init__()" method.  If there is no "__init__()" method, the
      class must be called without arguments.

   Instances de classes
      Class instances are described below.  Class instances are
      callable only when the class has a "__call__()" method;
      "x(arguments)" is a shorthand for "x.__call__(arguments)".

Modules
   Modules are imported by the "import" statement (see section
   L’instruction import). A module object has a namespace implemented
   by a dictionary object (this is the dictionary referenced by the
   func_globals attribute of functions defined in the module).
   Attribute references are translated to lookups in this dictionary,
   e.g., "m.x" is equivalent to "m.__dict__["x"]". A module object
   does not contain the code object used to initialize the module
   (since it isn’t needed once the initialization is done).

   L’assignation d’un attribut met à jour le dictionnaire d’espace de
   noms du module, par exemple "m.x = 1" est équivalent à
   "m.__dict__["x"] = 1".

   Attribut spécial en lecture seule : "__dict__" est l’objet
   dictionnaire répertoriant l’espace de noms du module.

   en raison de la manière dont CPython nettoie les dictionnaires de
   modules, le dictionnaire du module est effacé quand le module n’est
   plus visible, même si le dictionnaire possède encore des références
   actives. Pour éviter ceci, copiez le dictionnaire ou gardez le
   module dans votre champ de visibilité tant que vous souhaitez
   utiliser le dictionnaire directement.

   Predefined (writable) attributes: "__name__" is the module’s name;
   "__doc__" is the module’s documentation string, or "None" if
   unavailable; "__file__" is the pathname of the file from which the
   module was loaded, if it was loaded from a file. The "__file__"
   attribute is not present for C modules that are statically linked
   into the interpreter; for extension modules loaded dynamically from
   a shared library, it is the pathname of the shared library file.

Classes
   Both class types (new-style classes) and class objects (old-
   style/classic classes) are typically created by class definitions
   (see section Définition de classes).  A class has a namespace
   implemented by a dictionary object. Class attribute references are
   translated to lookups in this dictionary, e.g., "C.x" is translated
   to "C.__dict__["x"]" (although for new-style classes in particular
   there are a number of hooks which allow for other means of locating
   attributes). When the attribute name is not found there, the
   attribute search continues in the base classes.  For old-style
   classes, the search is depth-first, left-to-right in the order of
   occurrence in the base class list. New-style classes use the more
   complex C3 method resolution order which behaves correctly even in
   the presence of “diamond” inheritance structures where there are
   multiple inheritance paths leading back to a common ancestor.
   Additional details on the C3 MRO used by new-style classes can be
   found in the documentation accompanying the 2.3 release at
   https://www.python.org/download/releases/2.3/mro/.

   When a class attribute reference (for class "C", say) would yield a
   user-defined function object or an unbound user-defined method
   object whose associated class is either "C" or one of its base
   classes, it is transformed into an unbound user-defined method
   object whose "im_class" attribute is "C". When it would yield a
   class method object, it is transformed into a bound user-defined
   method object whose "im_self" attribute is "C".  When it would
   yield a static method object, it is transformed into the object
   wrapped by the static method object. See section Implémentation de
   descripteurs for another way in which attributes retrieved from a
   class may differ from those actually contained in its "__dict__"
   (note that only new-style classes support descriptors).

   Les assignations d’un attribut de classe mettent à jour le
   dictionnaire de la classe, jamais le dictionnaire d’une classe de
   base.

   Un objet classe peut être appelé (voir ci-dessus) pour produire une
   instance de classe (voir ci-dessous).

   Special attributes: "__name__" is the class name; "__module__" is
   the module name in which the class was defined; "__dict__" is the
   dictionary containing the class’s namespace; "__bases__" is a tuple
   (possibly empty or a singleton) containing the base classes, in the
   order of their occurrence in the base class list; "__doc__" is the
   class’s documentation string, or "None" if undefined.

Instances de classes
   A class instance is created by calling a class object (see above).
   A class instance has a namespace implemented as a dictionary which
   is the first place in which attribute references are searched.
   When an attribute is not found there, and the instance’s class has
   an attribute by that name, the search continues with the class
   attributes.  If a class attribute is found that is a user-defined
   function object or an unbound user-defined method object whose
   associated class is the class (call it "C") of the instance for
   which the attribute reference was initiated or one of its bases, it
   is transformed into a bound user-defined method object whose
   "im_class" attribute is "C" and whose "im_self" attribute is the
   instance. Static method and class method objects are also
   transformed, as if they had been retrieved from class "C"; see
   above under « Classes ». See section Implémentation de descripteurs
   for another way in which attributes of a class retrieved via its
   instances may differ from the objects actually stored in the
   class’s "__dict__". If no class attribute is found, and the
   object’s class has a "__getattr__()" method, that is called to
   satisfy the lookup.

   Les assignations et suppressions d’attributs mettent à jour le
   dictionnaire de l’instance, jamais le dictionnaire de la classe. Si
   la classe possède une méthode "__setattr__()" ou "__delattr__()",
   elle est appelée au lieu de mettre à jour le dictionnaire de
   l’instance directement.

   Les instances de classes peuvent prétendre être des nombres, des
   séquences ou des tableaux de correspondance si elles ont des
   méthodes avec des noms spéciaux. Voir la section Méthodes
   spéciales.

   Attributs spéciaux : "__dict__" est le dictionnaire des attributs ;
   "__class__" est la classe de l’instance.

Files
   A file object represents an open file.  File objects are created by
   the "open()" built-in function, and also by "os.popen()",
   "os.fdopen()", and the "makefile()" method of socket objects (and
   perhaps by other functions or methods provided by extension
   modules).  The objects "sys.stdin", "sys.stdout" and "sys.stderr"
   are initialized to file objects corresponding to the interpreter’s
   standard input, output and error streams.  See Objets fichiers for
   complete documentation of file objects.

Types internes
   Quelques types utilisés en interne par l’interpréteur sont
   accessibles à l’utilisateur. Leur définition peut changer dans les
   futures versions de l’interpréteur mais ils sont donnés ci-dessous
   à fin d’exhaustivité.

   Objets Code
      Un objet code représente le code Python sous sa forme compilée
      en *bytecode*. La différence entre un objet code et un objet
      fonction est que l’objet fonction contient une référence
      explicite vers les globales de la fonction (le module dans
      lequel elle est définie) alors qu’un objet code ne contient
      aucun contexte ; par ailleurs, les valeurs par défaut des
      arguments sont stockées dans l’objet fonction, pas dans l’objet
      code (parce que ce sont des valeurs calculées au moment de
      l’exécution). Contrairement aux objets fonctions, les objets
      codes sont immuables et ne contiennent aucune référence (directe
      ou indirecte) à des objets muables.

      Attributs spéciaux en lecture seule : "co_name" donne le nom de
      la fonction ; "co_argcount" est le nombre d’arguments
      positionnels (y compris les arguments avec des valeurs par
      défaut) ; "co_nlocals" est le nombre de variables locales
      utilisées par la fonction (y compris les arguments) ;
      "co_varnames" est un tuple contenant le nom des variables
      locales (en commençant par les noms des arguments) ;
      "co_cellvars" est un tuple contenant les noms des variables
      locales qui sont référencées par des fonctions imbriquées ;
      "co_freevars" est un tuple contenant les noms des variables
      libres ; "co_code" est une chaîne représentant la séquence des
      instructions de *bytecode* ; "co_consts" est un tuple contenant
      les littéraux utilisés par le *bytecode* ; "co_names" est un
      tuple contenant les noms utilisés par le *bytecode* ;
      "co_filename" est le nom de fichier à partir duquel le code a
      été compilé ; "co_firstlineno" est numéro de la première ligne
      de la fonction ; "co_lnotab" est une chaîne qui code la
      correspondance entre les différents endroits du *bytecode* et
      les numéros de lignes (pour les détails, regardez le code source
      de l’interpréteur) ; "co_stacksize" est la taille de pile
      nécessaire (y compris pour les variables locales) ; "co_flags"
      est un entier qui code différents drapeaux pour l’interpréteur.

      Les drapeaux suivants sont codés par des bits dans "co_flags" :
      le bit "0x04" est positionné à 1 si la fonction utilise la
      syntaxe "*arguments" pour accepter un nombre arbitraire
      d’arguments positionnels ; le bit "0x08" est positionné à 1 si
      la fonction utilise la syntaxe "**keywords" pour accepter un
      nombre arbitraire d’arguments nommés ; le bit "0x20" est
      positionné à 1 si la fonction est un générateur.

      Les déclarations de fonctionnalité future "from __future__
      import division" utilisent aussi des bits dans "co_flags" pour
      indiquer si l’objet code a été compilé avec une fonctionnalité
      future : le bit "0x2000" est positionné à 1 si la fonction a été
      compilée avec la division future activée ; les bits "0x10" et
      "0x1000" étaient utilisés dans les versions antérieures de
      Python.

      Les autres bits de "co_flags" sont réservés à un usage interne.

      Si l’objet code représente une fonction, le premier élément dans
      "co_consts" est la chaîne de documentation de la fonction (ou
      "None" s’il n’y en a pas).

   Objets cadres
      Un objet cadre représente le cadre d’exécution. Ils apparaissent
      dans des objets traces (voir plus loin).

      Special read-only attributes: "f_back" is to the previous stack
      frame (towards the caller), or "None" if this is the bottom
      stack frame; "f_code" is the code object being executed in this
      frame; "f_locals" is the dictionary used to look up local
      variables; "f_globals" is used for global variables;
      "f_builtins" is used for built-in (intrinsic) names;
      "f_restricted" is a flag indicating whether the function is
      executing in restricted execution mode; "f_lasti" gives the
      precise instruction (this is an index into the bytecode string
      of the code object).

      Special writable attributes: "f_trace", if not "None", is a
      function called at the start of each source code line (this is
      used by the debugger); "f_exc_type", "f_exc_value",
      "f_exc_traceback" represent the last exception raised in the
      parent frame provided another exception was ever raised in the
      current frame (in all other cases they are "None"); "f_lineno"
      is the current line number of the frame — writing to this from
      within a trace function jumps to the given line (only for the
      bottom-most frame).  A debugger can implement a Jump command
      (aka Set Next Statement) by writing to f_lineno.

   Objets traces
      Traceback objects represent a stack trace of an exception.  A
      traceback object is created when an exception occurs.  When the
      search for an exception handler unwinds the execution stack, at
      each unwound level a traceback object is inserted in front of
      the current traceback.  When an exception handler is entered,
      the stack trace is made available to the program. (See section
      L’instruction try.) It is accessible as "sys.exc_traceback", and
      also as the third item of the tuple returned by
      "sys.exc_info()".  The latter is the preferred interface, since
      it works correctly when the program is using multiple threads.
      When the program contains no suitable handler, the stack trace
      is written (nicely formatted) to the standard error stream; if
      the interpreter is interactive, it is also made available to the
      user as "sys.last_traceback".

      Attributs spéciaux en lecture seule : "tb_next" est le prochain
      niveau dans la pile d’appels (vers le cadre où l’exception a été
      levée) ou "None" s’il n’y a pas de prochain niveau ; "tb_frame"
      pointe vers le cadre d’exécution du niveau courant ; "tb_lineno"
      donne le numéro de ligne où l’exception a été levée ; "tb_lasti"
      indique l’instruction précise. Le numéro de ligne et la dernière
      instruction dans la trace peuvent différer du numéro de ligne de
      l’objet cadre si l’exception a eu lieu dans une instruction
      "try" sans qu’il n’y ait de clause "except" adéquate ou sans
      clause "finally".

   Objets tranches
      Slice objects are used to represent slices when *extended slice
      syntax* is used. This is a slice using two colons, or multiple
      slices or ellipses separated by commas, e.g., "a[i:j:step]",
      "a[i:j, k:l]", or "a[..., i:j]".  They are also created by the
      built-in "slice()" function.

      Attributs spéciaux en lecture seule : "start" est la borne
      inférieure ; "stop" est la borne supérieure ; "step" est la
      valeur du pas ; chaque attribut vaut "None" s’il est omis. Ces
      attributs peuvent être de n’importe quel type.

      Les objets tranches comprennent une méthode :

      slice.indices(self, length)

         This method takes a single integer argument *length* and
         computes information about the extended slice that the slice
         object would describe if applied to a sequence of *length*
         items.  It returns a tuple of three integers; respectively
         these are the *start* and *stop* indices and the *step* or
         stride length of the slice. Missing or out-of-bounds indices
         are handled in a manner consistent with regular slices.

         Nouveau dans la version 2.3.

   Objets méthodes statiques
      Les objets méthodes statiques permettent la transformation des
      objets fonctions en objets méthodes décrits au-dessus. Un objet
      méthode statique encapsule tout autre objet, souvent un objet
      méthode définie par l’utilisateur. Quand un objet méthode
      statique est récupéré depuis une classe ou une instance de
      classe, l’objet réellement renvoyé est un objet encapsulé, qui
      n’a pas vocation à être transformé encore une fois. Les objets
      méthodes statiques ne sont pas appelables en tant que tels, bien
      que les objets qu’ils encapsulent le soient souvent. Les objets
      méthodes statiques sont créés par le constructeur natif
      "staticmethod()".

   Objets méthodes de classes
      Un objet méthode de classe, comme un objet méthode statique,
      encapsule un autre objet afin de modifier la façon dont cet
      objet est récupéré depuis les classes et instances de classes.
      Le comportement des objets méthodes de classes dans le cas d’une
      telle récupération est décrit plus haut, dans « méthodes
      définies par l’utilisateur ». Les objets méthodes de classes
      sont créés par le constructeur natif "classmethod()".


3.3. New-style and classic classes
==================================

Classes and instances come in two flavors: old-style (or classic) and
new-style.

Up to Python 2.1 the concept of "class" was unrelated to the concept
of "type", and old-style classes were the only flavor available.  For
an old-style class, the statement "x.__class__" provides the class of
*x*, but "type(x)" is always "<type 'instance'>".  This reflects the
fact that all old-style instances, independent of their class, are
implemented with a single built-in type, called "instance".

New-style classes were introduced in Python 2.2 to unify the concepts
of "class" and "type".  A new-style class is simply a user-defined
type, no more, no less.  If *x* is an instance of a new-style class,
then "type(x)" is typically the same as "x.__class__" (although this
is not guaranteed – a new-style class instance is permitted to
override the value returned for "x.__class__").

The major motivation for introducing new-style classes is to provide a
unified object model with a full meta-model.  It also has a number of
practical benefits, like the ability to subclass most built-in types,
or the introduction of « descriptors », which enable computed
properties.

For compatibility reasons, classes are still old-style by default.
New-style classes are created by specifying another new-style class
(i.e. a type) as a parent class, or the « top-level type » "object" if
no other parent is needed.  The behaviour of new-style classes differs
from that of old-style classes in a number of important details in
addition to what "type()" returns.  Some of these changes are
fundamental to the new object model, like the way special methods are
invoked.  Others are « fixes » that could not be implemented before
for compatibility concerns, like the method resolution order in case
of multiple inheritance.

While this manual aims to provide comprehensive coverage of Python’s
class mechanics, it may still be lacking in some areas when it comes
to its coverage of new-style classes. Please see
https://www.python.org/doc/newstyle/ for sources of additional
information.

Old-style classes are removed in Python 3, leaving only new-style
classes.


3.4. Méthodes spéciales
=======================

A class can implement certain operations that are invoked by special
syntax (such as arithmetic operations or subscripting and slicing) by
defining methods with special names. This is Python’s approach to
*operator overloading*, allowing classes to define their own behavior
with respect to language operators.  For instance, if a class defines
a method named "__getitem__()", and "x" is an instance of this class,
then "x[i]" is roughly equivalent to "x.__getitem__(i)" for old-style
classes and "type(x).__getitem__(x, i)" for new-style classes.  Except
where mentioned, attempts to execute an operation raise an exception
when no appropriate method is defined (typically "AttributeError" or
"TypeError").

Lorsque vous implémentez une classe qui émule un type natif, il est
important que cette émulation n’implémente que ce qui fait sens pour
l’objet qui est modélisé. Par exemple, la recherche d’éléments
individuels d’une séquence peut faire sens, mais pas l’extraction
d’une tranche (un exemple est l’interface de "NodeList" dans le modèle
objet des documents W3C).


3.4.1. Personnalisation de base
-------------------------------

object.__new__(cls[, ...])

   Appelée pour créer une nouvelle instance de la classe *cls*. La
   méthode "__new__()" est statique (c’est un cas particulier, vous
   n’avez pas besoin de la déclarer comme telle) qui prend comme
   premier argument la classe pour laquelle on veut créer une
   instance. Les autres arguments sont ceux passés à l’expression de
   l’objet constructeur (l’appel à la classe). La valeur de retour de
   "__new__()" doit être l’instance du nouvel objet (classiquement une
   instance de *cls*).

   Typical implementations create a new instance of the class by
   invoking the superclass’s "__new__()" method using
   "super(currentclass, cls).__new__(cls[, ...])" with appropriate
   arguments and then modifying the newly-created instance as
   necessary before returning it.

   Si "__new__()" renvoie une instance de *cls*, alors la méthode
   "__init__()" de la nouvelle instance est invoquée avec
   "__init__(self[, ...])" où *self* est la nouvelle instance et les
   autres arguments sont les mêmes que ceux passés à "__new__()".

   Si "__new__()" ne renvoie pas une instance de *cls*, alors la
   méthode "__init__()" de la nouvelle instance n’est pas invoquée.

   L’objectif de "__new__()" est principalement, pour les sous-classes
   de types immuables (comme "int", "str" ou "tuple"), d’autoriser la
   création sur mesure des instances. Elle est aussi souvent
   surchargée dans les méta-classes pour particulariser la création
   des classes.

object.__init__(self[, ...])

   Called after the instance has been created (by "__new__()"), but
   before it is returned to the caller.  The arguments are those
   passed to the class constructor expression.  If a base class has an
   "__init__()" method, the derived class’s "__init__()" method, if
   any, must explicitly call it to ensure proper initialization of the
   base class part of the instance; for example:
   "BaseClass.__init__(self, [args...])".

   Because "__new__()" and "__init__()" work together in constructing
   objects ("__new__()" to create it, and "__init__()" to customise
   it), no non-"None" value may be returned by "__init__()"; doing so
   will cause a "TypeError" to be raised at runtime.

object.__del__(self)

   Called when the instance is about to be destroyed.  This is also
   called a destructor.  If a base class has a "__del__()" method, the
   derived class’s "__del__()" method, if any, must explicitly call it
   to ensure proper deletion of the base class part of the instance.
   Note that it is possible (though not recommended!) for the
   "__del__()" method to postpone destruction of the instance by
   creating a new reference to it.  It may then be called at a later
   time when this new reference is deleted.  It is not guaranteed that
   "__del__()" methods are called for objects that still exist when
   the interpreter exits.

   Note: "del x" doesn’t directly call "x.__del__()" — the former
     decrements the reference count for "x" by one, and the latter is
     only called when "x"’s reference count reaches zero.  Some common
     situations that may prevent the reference count of an object from
     going to zero include: circular references between objects (e.g.,
     a doubly-linked list or a tree data structure with parent and
     child pointers); a reference to the object on the stack frame of
     a function that caught an exception (the traceback stored in
     "sys.exc_traceback" keeps the stack frame alive); or a reference
     to the object on the stack frame that raised an unhandled
     exception in interactive mode (the traceback stored in
     "sys.last_traceback" keeps the stack frame alive).  The first
     situation can only be remedied by explicitly breaking the cycles;
     the latter two situations can be resolved by storing "None" in
     "sys.exc_traceback" or "sys.last_traceback".  Circular references
     which are garbage are detected when the option cycle detector is
     enabled (it’s on by default), but can only be cleaned up if there
     are no Python-level "__del__()" methods involved. Refer to the
     documentation for the "gc" module for more information about how
     "__del__()" methods are handled by the cycle detector,
     particularly the description of the "garbage" value.

   Avertissement: Due to the precarious circumstances under which
     "__del__()" methods are invoked, exceptions that occur during
     their execution are ignored, and a warning is printed to
     "sys.stderr" instead. Also, when "__del__()" is invoked in
     response to a module being deleted (e.g., when execution of the
     program is done), other globals referenced by the "__del__()"
     method may already have been deleted or in the process of being
     torn down (e.g. the import machinery shutting down).  For this
     reason, "__del__()" methods should do the absolute minimum needed
     to maintain external invariants.  Starting with version 1.5,
     Python guarantees that globals whose name begins with a single
     underscore are deleted from their module before other globals are
     deleted; if no other references to such globals exist, this may
     help in assuring that imported modules are still available at the
     time when the "__del__()" method is called.

   See also the "-R" command-line option.

object.__repr__(self)

   Called by the "repr()" built-in function and by string conversions
   (reverse quotes) to compute the « official » string representation
   of an object.  If at all possible, this should look like a valid
   Python expression that could be used to recreate an object with the
   same value (given an appropriate environment).  If this is not
   possible, a string of the form "<...some useful description...>"
   should be returned.  The return value must be a string object. If a
   class defines "__repr__()" but not "__str__()", then "__repr__()"
   is also used when an « informal » string representation of
   instances of that class is required.

   Cette fonction est principalement utilisée à fins de débogage, il
   est donc important que la représentation donne beaucoup
   d’informations et ne soit pas ambigüe.

object.__str__(self)

   Called by the "str()" built-in function and by the "print"
   statement to compute the « informal » string representation of an
   object.  This differs from "__repr__()" in that it does not have to
   be a valid Python expression: a more convenient or concise
   representation may be used instead. The return value must be a
   string object.

object.__lt__(self, other)
object.__le__(self, other)
object.__eq__(self, other)
object.__ne__(self, other)
object.__gt__(self, other)
object.__ge__(self, other)

   Nouveau dans la version 2.1.

   These are the so-called « rich comparison » methods, and are called
   for comparison operators in preference to "__cmp__()" below. The
   correspondence between operator symbols and method names is as
   follows: "x<y" calls "x.__lt__(y)", "x<=y" calls "x.__le__(y)",
   "x==y" calls "x.__eq__(y)", "x!=y" and "x<>y" call "x.__ne__(y)",
   "x>y" calls "x.__gt__(y)", and "x>=y" calls "x.__ge__(y)".

   Une méthode de comparaison riche peut renvoyer le singleton
   "NotImplemented" si elle n’implémente pas l’opération pour une
   paire donnée d’arguments. Par convention, "False" et "True" sont
   renvoyées pour une comparaison qui a réussi. Cependant, ces
   méthodes peuvent renvoyer n’importe quelle valeur donc, si
   l’opérateur de comparaison est utilisé dans un contexte booléen
   (par exemple dans une condition d’une instruction "if"), Python
   appelle "bool()" sur la valeur pour déterminer si le résultat est
   faux ou vrai.

   There are no implied relationships among the comparison operators.
   The truth of "x==y" does not imply that "x!=y" is false.
   Accordingly, when defining "__eq__()", one should also define
   "__ne__()" so that the operators will behave as expected.  See the
   paragraph on "__hash__()" for some important notes on creating
   *hashable* objects which support custom comparison operations and
   are usable as dictionary keys.

   There are no swapped-argument versions of these methods (to be used
   when the left argument does not support the operation but the right
   argument does); rather, "__lt__()" and "__gt__()" are each other’s
   reflection, "__le__()" and "__ge__()" are each other’s reflection,
   and "__eq__()" and "__ne__()" are their own reflection.

   Arguments to rich comparison methods are never coerced.

   To automatically generate ordering operations from a single root
   operation, see "functools.total_ordering()".

object.__cmp__(self, other)

   Called by comparison operations if rich comparison (see above) is
   not defined.  Should return a negative integer if "self < other",
   zero if "self == other", a positive integer if "self > other".  If
   no "__cmp__()", "__eq__()" or "__ne__()" operation is defined,
   class instances are compared by object identity (« address »).  See
   also the description of "__hash__()" for some important notes on
   creating *hashable* objects which support custom comparison
   operations and are usable as dictionary keys. (Note: the
   restriction that exceptions are not propagated by "__cmp__()" has
   been removed since Python 1.5.)

object.__rcmp__(self, other)

   Modifié dans la version 2.1: No longer supported.

object.__hash__(self)

   Called by built-in function "hash()" and for operations on members
   of hashed collections including "set", "frozenset", and "dict".
   "__hash__()" should return an integer.  The only required property
   is that objects which compare equal have the same hash value; it is
   advised to mix together the hash values of the components of the
   object that also play a part in comparison of objects by packing
   them into a tuple and hashing the tuple. Example:

      def __hash__(self):
          return hash((self.name, self.nick, self.color))

   If a class does not define a "__cmp__()" or "__eq__()" method it
   should not define a "__hash__()" operation either; if it defines
   "__cmp__()" or "__eq__()" but not "__hash__()", its instances will
   not be usable in hashed collections.  If a class defines mutable
   objects and implements a "__cmp__()" or "__eq__()" method, it
   should not implement "__hash__()", since hashable collection
   implementations require that an object’s hash value is immutable
   (if the object’s hash value changes, it will be in the wrong hash
   bucket).

   User-defined classes have "__cmp__()" and "__hash__()" methods by
   default; with them, all objects compare unequal (except with
   themselves) and "x.__hash__()" returns a result derived from
   "id(x)".

   Classes which inherit a "__hash__()" method from a parent class but
   change the meaning of "__cmp__()" or "__eq__()" such that the hash
   value returned is no longer appropriate (e.g. by switching to a
   value-based concept of equality instead of the default identity
   based equality) can explicitly flag themselves as being unhashable
   by setting "__hash__ = None" in the class definition. Doing so
   means that not only will instances of the class raise an
   appropriate "TypeError" when a program attempts to retrieve their
   hash value, but they will also be correctly identified as
   unhashable when checking "isinstance(obj, collections.Hashable)"
   (unlike classes which define their own "__hash__()" to explicitly
   raise "TypeError").

   Modifié dans la version 2.5: "__hash__()" may now also return a
   long integer object; the 32-bit integer is then derived from the
   hash of that object.

   Modifié dans la version 2.6: "__hash__" may now be set to "None" to
   explicitly flag instances of a class as unhashable.

object.__nonzero__(self)

   Called to implement truth value testing and the built-in operation
   "bool()"; should return "False" or "True", or their integer
   equivalents "0" or "1".  When this method is not defined,
   "__len__()" is called, if it is defined, and the object is
   considered true if its result is nonzero. If a class defines
   neither "__len__()" nor "__nonzero__()", all its instances are
   considered true.

object.__unicode__(self)

   Called to implement "unicode()" built-in; should return a Unicode
   object. When this method is not defined, string conversion is
   attempted, and the result of string conversion is converted to
   Unicode using the system default encoding.


3.4.2. Personnalisation de l’accès aux attributs
------------------------------------------------

Les méthodes suivantes peuvent être définies pour personnaliser
l’accès aux attributs (utilisation, assignation, suppression de
"x.name") pour les instances de classes.

object.__getattr__(self, name)

   Called when an attribute lookup has not found the attribute in the
   usual places (i.e. it is not an instance attribute nor is it found
   in the class tree for "self").  "name" is the attribute name. This
   method should return the (computed) attribute value or raise an
   "AttributeError" exception.

   Note that if the attribute is found through the normal mechanism,
   "__getattr__()" is not called.  (This is an intentional asymmetry
   between "__getattr__()" and "__setattr__()".) This is done both for
   efficiency reasons and because otherwise "__getattr__()" would have
   no way to access other attributes of the instance.  Note that at
   least for instance variables, you can fake total control by not
   inserting any values in the instance attribute dictionary (but
   instead inserting them in another object).  See the
   "__getattribute__()" method below for a way to actually get total
   control in new-style classes.

object.__setattr__(self, name, value)

   Called when an attribute assignment is attempted.  This is called
   instead of the normal mechanism (i.e. store the value in the
   instance dictionary).  *name* is the attribute name, *value* is the
   value to be assigned to it.

   If "__setattr__()" wants to assign to an instance attribute, it
   should not simply execute "self.name = value" — this would cause a
   recursive call to itself.  Instead, it should insert the value in
   the dictionary of instance attributes, e.g., "self.__dict__[name] =
   value".  For new-style classes, rather than accessing the instance
   dictionary, it should call the base class method with the same
   name, for example, "object.__setattr__(self, name, value)".

object.__delattr__(self, name)

   Comme "__setattr__()" mais pour supprimer un attribut au lieu de
   l’assigner. Elle ne doit être implémentée que si "del obj.name" a
   du sens pour cet objet.


3.4.2.1. More attribute access for new-style classes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The following methods only apply to new-style classes.

object.__getattribute__(self, name)

   Appelée de manière inconditionnelle pour implémenter l’accès aux
   attributs des instances de la classe. Si la classe définit
   également "__getattr__()", cette dernière n’est pas appelée à moins
   que "__getattribute__()" ne l’appelle explicitement ou ne lève une
   exception "AttributeError". Cette méthode doit renvoyer la valeur
   (calculée) de l’attribut ou lever une exception "AttributeError".
   Afin d’éviter une récursion infinie sur cette méthode, son
   implémentation doit toujours appeler la méthode de la classe de
   base avec le même paramètre *name* pour accéder à n’importe quel
   attribut dont elle a besoin. Par exemple,
   "object.__getattribute__(self, name)".

   Note: This method may still be bypassed when looking up special
     methods as the result of implicit invocation via language syntax
     or built-in functions. See Special method lookup for new-style
     classes.


3.4.2.2. Implémentation de descripteurs
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Les méthodes qui suivent s’appliquent seulement quand une instance de
la classe (dite classe *descripteur*) contenant la méthode apparaît
dans une classe *propriétaire* (*owner* en anglais) ; la classe
descripteur doit figurer dans le dictionnaire de la classe
propriétaire ou dans le dictionnaire de la classe d’un des parents.
Dans les exemples ci-dessous, « l’attribut » fait référence à
l’attribut dont le nom est une clé du "__dict__" de la classe
propriétaire.

object.__get__(self, instance, owner)

   Appelée pour obtenir l’attribut de la classe propriétaire (accès à
   un attribut de classe) ou d’une instance de cette classe (accès à
   un attribut d’instance). *owner* est toujours la classe
   propriétaire alors que *instance* est l’instance par laquelle on
   accède à l’attribut ou "None" lorsque l’on accède par la classe
   *owner*. Cette méthode doit renvoyer la valeur (calculée) de
   l’attribut ou lever une exception "AttributeError".

object.__set__(self, instance, value)

   Appelée pour définir l’attribut d’une instance *instance* de la
   classe propriétaire à la nouvelle valeur *value*.

object.__delete__(self, instance)

   Appelée pour supprimer l’attribut de l’instance *instance* de la
   classe propriétaire.


3.4.2.3. Invocation des descripteurs
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

En général, un descripteur est un attribut d’objet dont le
comportement est « lié » (*binding dehavior* en anglais), c’est-à-dire
que les accès aux attributs ont été surchargés par des méthodes
conformes au protocole des descripteurs : "__get__()", "__set__()" et
"__delete__()". Si l’une de ces méthodes est définie pour un objet, il
est réputé être un descripteur.

Le comportement par défaut pour la gestion d’un attribut est de
définir, obtenir et supprimer cet attribut du dictionnaire de l’objet.
Par exemple, pour "a.x" Python commence d’abord par rechercher
"a.__dict__['x']", puis "type(a).__dict__['x']" ; ensuite Python
continue en remontant les classes de base de "type(a)", en excluant
les méta-classes.

However, 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 and
how they were called.  Note that descriptors are only invoked for new
style objects or classes (ones that subclass "object()" or "type()").

Le point de départ pour une invocation de descripteur est la liaison
"a.x". La façon dont les arguments sont assemblés dépend de "a" :

Appel direct
   Le plus simple et le plus rare des appels est quand l’utilisateur
   code directement l’appel à la méthode du descripteur :
   "x.__get__(a)".

Liaison avec une instance
   If binding to a new-style object instance, "a.x" is transformed
   into the call: "type(a).__dict__['x'].__get__(a, type(a))".

Liaison avec une classe
   If binding to a new-style class, "A.x" is transformed into the
   call: "A.__dict__['x'].__get__(None, A)".

Liaison super
   Si "a" est une instance de "super", alors "super(B, obj).m()"
   recherche "obj.__class__.__mro__" pour la classe de base "A"
   immédiatement avant "B" puis invoque le descripteur avec l’appel
   suivant : "A.__dict__['m'].__get__(obj, obj.__class__)".

Pour des liaisons avec des instances, la priorité à l’invocation du
descripteur dépend des méthodes que le descripteur a définies. Un
descripteur peut définir n’importe quelle combinaison de "__get__()",
"__set__()" et "__delete__()". S’il ne définit pas "__get__()", alors
accéder à l’attribut retourne l’objet descripteur lui-même sauf s’il
existe une valeur dans le dictionnaire de l’objet instance. Si le
descripteur définit "__set__()" ou "__delete__()", c’est un
descripteur de données ; s’il ne définit aucune méthode, c’est un
descripteur hors-donnée. Normalement, les descripteurs de données
définissent à la fois "__get__()" et "__set__()", alors que les
descripteurs hors-données définissent seulement la méthode
"__get__()". Les descripteurs de données qui définissent "__set__()"
et "__get__()" sont toujours prioritaires face à une redéfinition du
dictionnaire de l’instance. En revanche, les descripteurs hors-données
peuvent être shuntés par les instances.

Les méthodes Python (y compris "staticmethod()" et "classmethod()")
sont implémentées comme des descripteurs hors-donnée. De la même
manière, les instances peuvent redéfinir et surcharger les méthodes.
Ceci permet à chaque instance d’avoir un comportement qui diffère des
autres instances de la même classe.

La fonction "property()" est implémentée en tant que descripteur de
données. Ainsi, les instances ne peuvent pas surcharger le
comportement d’une propriété.


3.4.2.4. "__slots__"
~~~~~~~~~~~~~~~~~~~~

By default, instances of both old and new-style classes have a
dictionary for attribute storage.  This wastes space for objects
having very few instance variables.  The space consumption can become
acute when creating large numbers of instances.

The default can be overridden by defining *__slots__* in a new-style
class definition.  The *__slots__* declaration takes a sequence of
instance variables and reserves just enough space in each instance to
hold a value for each variable.  Space is saved because *__dict__* is
not created for each instance.

__slots__

   This class variable can be assigned a string, iterable, or sequence
   of strings with variable names used by instances.  If defined in a
   new-style class, *__slots__* reserves space for the declared
   variables and prevents the automatic creation of *__dict__* and
   *__weakref__* for each instance.

   Nouveau dans la version 2.2.

Note sur l’utilisation de *__slots__*

* When inheriting from a class without *__slots__*, the *__dict__*
  attribute of that class will always be accessible, so a *__slots__*
  definition in the subclass is meaningless.

* Sans variable *__dict__*, les instances ne peuvent pas assigner de
  nouvelles variables (non listées dans la définition de *__slots__*).
  Les tentatives d’assignation sur un nom de variable non listé lève
  "AttributeError". Si l’assignation dynamique de nouvelles variables
  est nécessaire, ajoutez "'__dict__'" à la séquence de chaînes dans
  la déclaration *__slots__*.

  Modifié dans la version 2.3: Previously, adding "'__dict__'" to the
  *__slots__* declaration would not enable the assignment of new
  attributes not specifically listed in the sequence of instance
  variable names.

* Sans variable *__weakref__* pour chaque instance, les classes qui
  définissent *__slots__* ne gèrent pas les références faibles vers
  leurs instances. Si vous avez besoin de gérer des références
  faibles, ajoutez "'__weakref__'" à la séquence de chaînes dans la
  déclaration de *__slots__*.

  Modifié dans la version 2.3: Previously, adding "'__weakref__'" to
  the *__slots__* declaration would not enable support for weak
  references.

* Les *__slots__* sont implémentés au niveau de la classe en créant
  des descripteurs (Implémentation de descripteurs) pour chaque nom de
  variable. Ainsi, les attributs de classe ne peuvent pas être
  utilisés pour des valeurs par défaut aux variables d’instances
  définies par *__slots__* ; sinon, l’attribut de classe surchargerait
  l’assignation par descripteur.

* The action of a *__slots__* declaration is limited to the class
  where it is defined.  As a result, subclasses will have a *__dict__*
  unless they also define *__slots__* (which must only contain names
  of any *additional* slots).

* Si une classe définit un *slot* déjà défini dans une classe de
  base, la variable d’instance définie par la classe de base est
  inaccessible (sauf à utiliser le descripteur de la classe de base
  directement). Cela rend la signification du programme indéfinie.
  Dans le futur, une vérification sera ajoutée pour empêcher cela.

* Nonempty *__slots__* does not work for classes derived from «
  variable-length » built-in types such as "long", "str" and "tuple".

* Tout itérable qui n’est pas une chaîne peut être assigné à un
  *__slots__*. Les tableaux de correspondance peuvent aussi être
  utilisés ; cependant, dans le futur, des significations spéciales
  pourraient être associées à chacune des clés.

* Les assignations de *__class__* ne fonctionnent que si les deux
  classes ont le même *__slots__*.

  Modifié dans la version 2.6: Previously, *__class__* assignment
  raised an error if either new or old class had *__slots__*.


3.4.3. Personnalisation de la création de classes
-------------------------------------------------

By default, new-style classes are constructed using "type()". A class
definition is read into a separate namespace and the value of class
name is bound to the result of "type(name, bases, dict)".

When the class definition is read, if *__metaclass__* is defined then
the callable assigned to it will be called instead of "type()". This
allows classes or functions to be written which monitor or alter the
class creation process:

* Modifying the class dictionary prior to the class being created.

* Returning an instance of another class – essentially performing
  the role of a factory function.

These steps will have to be performed in the metaclass’s "__new__()"
method – "type.__new__()" can then be called from this method to
create a class with different properties.  This example adds a new
element to the class dictionary before creating the class:

   class metacls(type):
       def __new__(mcs, name, bases, dict):
           dict['foo'] = 'metacls was here'
           return type.__new__(mcs, name, bases, dict)

You can of course also override other class methods (or add new
methods); for example defining a custom "__call__()" method in the
metaclass allows custom behavior when the class is called, e.g. not
always creating a new instance.

__metaclass__

   This variable can be any callable accepting arguments for "name",
   "bases", and "dict".  Upon class creation, the callable is used
   instead of the built-in "type()".

   Nouveau dans la version 2.2.

The appropriate metaclass is determined by the following precedence
rules:

* If "dict['__metaclass__']" exists, it is used.

* Otherwise, if there is at least one base class, its metaclass is
  used (this looks for a *__class__* attribute first and if not found,
  uses its type).

* Otherwise, if a global variable named __metaclass__ exists, it is
  used.

* Otherwise, the old-style, classic metaclass (types.ClassType) is
  used.

The potential uses for metaclasses are boundless. Some ideas that have
been explored including logging, interface checking, automatic
delegation, automatic property creation, proxies, frameworks, and
automatic resource locking/synchronization.


3.4.4. Personnalisation des instances et vérification des sous-classes
----------------------------------------------------------------------

Nouveau dans la version 2.6.

Les méthodes suivantes sont utilisées pour surcharger le comportement
par défaut des fonctions natives "isinstance()" et "issubclass()".

En particulier, la méta-classe "abc.ABCMeta" implémente ces méthodes
pour autoriser l’ajout de classes de base abstraites  (ABC pour
*Abstract Base Classes* en anglais) en tant que « classes de base
virtuelles » pour toute classe ou type (y compris les types natifs).

class.__instancecheck__(self, instance)

   Renvoie "True" si *instance* doit être considérée comme une
   instance (directe ou indirecte) de *class*. Si elle est définie,
   est elle appelée pour implémenter "isinstance(instance, class)".

class.__subclasscheck__(self, subclass)

   Renvoie "True" si *subclass* doit être considérée comme une sous-
   classe (directe ou indirecte) de *class*. Si elle est définie,
   appelée pour implémenter "issubclass(subclass, class)".

Notez que ces méthodes sont recherchées dans le type (la méta-classe)
d’une classe. Elles ne peuvent pas être définies en tant que méthodes
de classe dans la classe réelle. C’est cohérent avec la recherche des
méthodes spéciales qui sont appelées pour les instances, sauf qu’ici
l’instance est elle-même une classe.

Voir aussi:

  **PEP 3119** – Introduction aux classes de bases abstraites
     Inclut la spécification pour la personnalisation du comportement
     de "isinstance()" et "issubclass()" à travers
     "__instancecheck__()" et "__subclasscheck__()", avec comme
     motivation pour cette fonctionnalité l’ajout les classes de base
     abstraites (voir le module "abc") au langage.


3.4.5. Émulation d’objets appelables
------------------------------------

object.__call__(self[, args...])

   Appelée quand l’instance est « appelée » en tant que fonction ; si
   la méthode est définie, "x(arg1, arg2, ...)" est un raccourci pour
   "x.__call__(arg1, arg2, ...)".


3.4.6. Émulation de types conteneurs
------------------------------------

The following methods can be defined to implement container objects.
Containers usually are sequences (such as lists or tuples) or mappings
(like dictionaries), but can represent other containers as well.  The
first set of methods is used either to emulate a sequence or to
emulate a mapping; the difference is that for a sequence, the
allowable keys should be the integers *k* for which "0 <= k < N" where
*N* is the length of the sequence, or slice objects, which define a
range of items. (For backwards compatibility, the method
"__getslice__()" (see below) can also be defined to handle simple, but
not extended slices.) It is also recommended that mappings provide the
methods "keys()", "values()", "items()", "has_key()", "get()",
"clear()", "setdefault()", "iterkeys()", "itervalues()",
"iteritems()", "pop()", "popitem()", "copy()", and "update()" behaving
similar to those for Python’s standard dictionary objects.  The
"UserDict" module provides a "DictMixin" class to help create those
methods from a base set of "__getitem__()", "__setitem__()",
"__delitem__()", and "keys()". Mutable sequences should provide
methods "append()", "count()", "index()", "extend()", "insert()",
"pop()", "remove()", "reverse()" and "sort()", like Python standard
list objects.  Finally, sequence types should implement addition
(meaning concatenation) and multiplication (meaning repetition) by
defining the methods "__add__()", "__radd__()", "__iadd__()",
"__mul__()", "__rmul__()" and "__imul__()" described below; they
should not define "__coerce__()" or other numerical operators.  It is
recommended that both mappings and sequences implement the
"__contains__()" method to allow efficient use of the "in" operator;
for mappings, "in" should be equivalent of "has_key()"; for sequences,
it should search through the values.  It is further recommended that
both mappings and sequences implement the "__iter__()" method to allow
efficient iteration through the container; for mappings, "__iter__()"
should be the same as "iterkeys()"; for sequences, it should iterate
through the values.

object.__len__(self)

   Called to implement the built-in function "len()".  Should return
   the length of the object, an integer ">=" 0.  Also, an object that
   doesn’t define a "__nonzero__()" method and whose "__len__()"
   method returns zero is considered to be false in a Boolean context.

   **CPython implementation detail:** In CPython, the length is
   required to be at most "sys.maxsize". If the length is larger than
   "sys.maxsize" some features (such as "len()") may raise
   "OverflowError".  To prevent raising "OverflowError" by truth value
   testing, an object must define a "__nonzero__()" method.

object.__getitem__(self, key)

   Appelée pour implémenter l’évaluation de "self[key]". Pour les
   types séquences, les clés autorisées sont les entiers et les objets
   tranches (*slice*). Notez que l’interprétation spéciale des indices
   négatifs (si la classe souhaite émuler un type séquence) est du
   ressort de la méthode "__getitem__()". Si *key* n’est pas du bon
   type, une "TypeError" peut être levée ; si la valeur est en dehors
   de l’ensemble des indices de la séquence (après interprétation
   éventuelle des valeurs négatives), une "IndexError" doit être
   levée. Pour les tableaux de correspondances, si *key* n’existe pas
   dans le conteneur, une "KeyError" doit être levée.

   Note: "for" s’attend à ce qu’une "IndexError" soit levée en cas
     d’indice illégal afin de détecter correctement la fin de la
     séquence.

object.__setitem__(self, key, value)

   Appelée pour implémenter l’assignation à "self[key]". La même note
   que pour "__getitem__()" s’applique. Elle ne doit être implémentée
   que pour les tableaux de correspondances qui autorisent les
   modifications de valeurs des clés, ceux pour lesquels on peut
   ajouter de nouvelles clés ou, pour les séquences, celles dont les
   éléments peuvent être remplacés. Les mêmes exceptions que pour la
   méthode "__getitem__()" doivent être levées en cas de mauvaises
   valeurs de clés.

object.__delitem__(self, key)

   Appelée pour implémenter la suppression de "self[key]". La même
   note que pour "__getitem__()" s’applique. Elle ne doit être
   implémentée que pour les tableaux de correspondances qui autorisent
   les suppressions de clés ou pour les séquences dont les éléments
   peuvent être supprimés de la séquence. Les mêmes exceptions que
   pour la méthode "__getitem__()" doivent être levées en cas de
   mauvaises valeurs de clés.

object.__missing__(self, key)

   Appelée par "dict"."__getitem__()" pour implémenter "self[key]"
   dans les sous-classes de dictionnaires lorsque la clé n’est pas
   dans le dictionnaire.

object.__iter__(self)

   This method is called when an iterator is required for a container.
   This method should return a new iterator object that can iterate
   over all the objects in the container.  For mappings, it should
   iterate over the keys of the container, and should also be made
   available as the method "iterkeys()".

   Les objets itérateurs doivent aussi implémenter cette méthode ; ils
   doivent alors se renvoyer eux-mêmes. Pour plus d’information sur
   les objets itérateurs, lisez Les types itérateurs.

object.__reversed__(self)

   Appelée (si elle existe) par la fonction native "reversed()" pour
   implémenter l’itération en sens inverse. Elle doit renvoyer un
   nouvel objet itérateur qui itère sur tous les objets du conteneur
   en sens inverse.

   Si la méthode "__reversed__()" n’est pas fournie, la fonction
   native "reversed()" se replie sur le protocole de séquence
   ("__len__()" et "__getitem__()"). Les objets qui connaissent le
   protocole de séquence ne doivent fournir "__reversed__()" que si
   l’implémentation qu’ils proposent est plus efficace que celle de
   "reversed()".

   Nouveau dans la version 2.6.

Les opérateurs de tests d’appartenance ("in" et "not in") sont
normalement implémentés comme des itérations sur la séquence.
Cependant, les objets conteneurs peuvent fournir les méthodes
spéciales suivantes avec une implémentation plus efficace, qui ne
requièrent d’ailleurs pas que l’objet soit une séquence.

object.__contains__(self, item)

   Appelée pour implémenter les opérateurs de test d’appartenance.
   Elle doit renvoyer "True" si *item* est dans *self* et "False"
   sinon. Pour les tableaux de correspondances, seules les clés sont
   considérées (pas les valeurs des paires clés-valeurs).

   Pour les objets qui ne définissent pas "__contains__()", les tests
   d’appartenance essaient d’abord d’itérer avec "__iter__()" puis
   avec le vieux protocole d’itération sur les séquences *via*
   "__getitem__()", reportez-vous à cette section dans la référence du
   langage.


3.4.7. Additional methods for emulation of sequence types
---------------------------------------------------------

The following optional methods can be defined to further emulate
sequence objects.  Immutable sequences methods should at most only
define "__getslice__()"; mutable sequences might define all three
methods.

object.__getslice__(self, i, j)

   Obsolète depuis la version 2.0: Support slice objects as parameters
   to the "__getitem__()" method. (However, built-in types in CPython
   currently still implement "__getslice__()".  Therefore, you have to
   override it in derived classes when implementing slicing.)

   Called to implement evaluation of "self[i:j]". The returned object
   should be of the same type as *self*.  Note that missing *i* or *j*
   in the slice expression are replaced by zero or "sys.maxsize",
   respectively.  If negative indexes are used in the slice, the
   length of the sequence is added to that index. If the instance does
   not implement the "__len__()" method, an "AttributeError" is
   raised. No guarantee is made that indexes adjusted this way are not
   still negative.  Indexes which are greater than the length of the
   sequence are not modified. If no "__getslice__()" is found, a slice
   object is created instead, and passed to "__getitem__()" instead.

object.__setslice__(self, i, j, sequence)

   Called to implement assignment to "self[i:j]". Same notes for *i*
   and *j* as for "__getslice__()".

   This method is deprecated. If no "__setslice__()" is found, or for
   extended slicing of the form "self[i:j:k]", a slice object is
   created, and passed to "__setitem__()", instead of "__setslice__()"
   being called.

object.__delslice__(self, i, j)

   Called to implement deletion of "self[i:j]". Same notes for *i* and
   *j* as for "__getslice__()". This method is deprecated. If no
   "__delslice__()" is found, or for extended slicing of the form
   "self[i:j:k]", a slice object is created, and passed to
   "__delitem__()", instead of "__delslice__()" being called.

Notice that these methods are only invoked when a single slice with a
single colon is used, and the slice method is available.  For slice
operations involving extended slice notation, or in absence of the
slice methods, "__getitem__()", "__setitem__()" or "__delitem__()" is
called with a slice object as argument.

The following example demonstrate how to make your program or module
compatible with earlier versions of Python (assuming that methods
"__getitem__()", "__setitem__()" and "__delitem__()" support slice
objects as arguments):

   class MyClass:
       ...
       def __getitem__(self, index):
           ...
       def __setitem__(self, index, value):
           ...
       def __delitem__(self, index):
           ...

       if sys.version_info < (2, 0):
           # They won't be defined if version is at least 2.0 final

           def __getslice__(self, i, j):
               return self[max(0, i):max(0, j):]
           def __setslice__(self, i, j, seq):
               self[max(0, i):max(0, j):] = seq
           def __delslice__(self, i, j):
               del self[max(0, i):max(0, j):]
       ...

Note the calls to "max()"; these are necessary because of the handling
of negative indices before the "__*slice__()" methods are called.
When negative indexes are used, the "__*item__()" methods receive them
as provided, but the "__*slice__()" methods get a « cooked » form of
the index values.  For each negative index value, the length of the
sequence is added to the index before calling the method (which may
still result in a negative index); this is the customary handling of
negative indexes by the built-in sequence types, and the "__*item__()"
methods are expected to do this as well.  However, since they should
already be doing that, negative indexes cannot be passed in; they must
be constrained to the bounds of the sequence before being passed to
the "__*item__()" methods. Calling "max(0, i)" conveniently returns
the proper value.


3.4.8. Émulation de types numériques
------------------------------------

Les méthodes suivantes peuvent être définies pour émuler des objets
numériques. Les méthodes correspondant à des opérations qui ne sont
pas autorisées pour la catégorie de nombres considérée (par exemple,
les opérations bit à bit pour les nombres qui ne sont pas entiers)
doivent être laissées indéfinies.

object.__add__(self, other)
object.__sub__(self, other)
object.__mul__(self, other)
object.__floordiv__(self, other)
object.__mod__(self, other)
object.__divmod__(self, other)
object.__pow__(self, other[, modulo])
object.__lshift__(self, other)
object.__rshift__(self, other)
object.__and__(self, other)
object.__xor__(self, other)
object.__or__(self, other)

   These methods are called to implement the binary arithmetic
   operations ("+", "-", "*", "//", "%", "divmod()", "pow()", "**",
   "<<", ">>", "&", "^", "|").  For instance, to evaluate the
   expression "x + y", where *x* is an instance of a class that has an
   "__add__()" method, "x.__add__(y)" is called.  The "__divmod__()"
   method should be the equivalent to using "__floordiv__()" and
   "__mod__()"; it should not be related to "__truediv__()" (described
   below).  Note that "__pow__()" should be defined to accept an
   optional third argument if the ternary version of the built-in
   "pow()" function is to be supported.

   Si l’une de ces méthodes n’autorise pas l’opération avec les
   arguments donnés, elle doit renvoyer "NotImplemented".

object.__div__(self, other)
object.__truediv__(self, other)

   The division operator ("/") is implemented by these methods.  The
   "__truediv__()" method is used when "__future__.division" is in
   effect, otherwise "__div__()" is used.  If only one of these two
   methods is defined, the object will not support division in the
   alternate context; "TypeError" will be raised instead.

object.__radd__(self, other)
object.__rsub__(self, other)
object.__rmul__(self, other)
object.__rdiv__(self, other)
object.__rtruediv__(self, other)
object.__rfloordiv__(self, other)
object.__rmod__(self, other)
object.__rdivmod__(self, other)
object.__rpow__(self, other)
object.__rlshift__(self, other)
object.__rrshift__(self, other)
object.__rand__(self, other)
object.__rxor__(self, other)
object.__ror__(self, other)

   These methods are called to implement the binary arithmetic
   operations ("+", "-", "*", "/", "%", "divmod()", "pow()", "**",
   "<<", ">>", "&", "^", "|") with reflected (swapped) operands.
   These functions are only called if the left operand does not
   support the corresponding operation and the operands are of
   different types. [2] For instance, to evaluate the expression "x -
   y", where *y* is an instance of a class that has an "__rsub__()"
   method, "y.__rsub__(x)" is called if "x.__sub__(y)" returns
   *NotImplemented*.

   Notez que la fonction ternaire "pow()" n’essaie pas d’appeler
   "__rpow__()" (les règles de coercition seraient trop compliquées).

   Note: Si le type de l’opérande de droite est une sous-classe du
     type de l’opérande de gauche et que cette sous-classe fournit la
     méthode symétrique pour l’opération, cette méthode sera appelée
     avant la méthode originelle de l’opérande gauche. Ce comportement
     permet à des sous-classes de surcharger les opérations de leurs
     ancêtres.

object.__iadd__(self, other)
object.__isub__(self, other)
object.__imul__(self, other)
object.__idiv__(self, other)
object.__itruediv__(self, other)
object.__ifloordiv__(self, other)
object.__imod__(self, other)
object.__ipow__(self, other[, modulo])
object.__ilshift__(self, other)
object.__irshift__(self, other)
object.__iand__(self, other)
object.__ixor__(self, other)
object.__ior__(self, other)

   These methods are called to implement the augmented arithmetic
   assignments ("+=", "-=", "*=", "/=", "//=", "%=", "**=", "<<=",
   ">>=", "&=", "^=", "|=").  These methods should attempt to do the
   operation in-place (modifying *self*) and return the result (which
   could be, but does not have to be, *self*).  If a specific method
   is not defined, the augmented assignment falls back to the normal
   methods.  For instance, to execute the statement "x += y", where
   *x* is an instance of a class that has an "__iadd__()" method,
   "x.__iadd__(y)" is called.  If *x* is an instance of a class that
   does not define a "__iadd__()" method, "x.__add__(y)" and
   "y.__radd__(x)" are considered, as with the evaluation of "x + y".

object.__neg__(self)
object.__pos__(self)
object.__abs__(self)
object.__invert__(self)

   Appelée pour implémenter les opérations arithmétiques unaires ("-",
   "+", "abs()" et "~").

object.__complex__(self)
object.__int__(self)
object.__long__(self)
object.__float__(self)

   Called to implement the built-in functions "complex()", "int()",
   "long()", and "float()".  Should return a value of the appropriate
   type.

object.__oct__(self)
object.__hex__(self)

   Called to implement the built-in functions "oct()" and "hex()".
   Should return a string value.

object.__index__(self)

   Called to implement "operator.index()".  Also called whenever
   Python needs an integer object (such as in slicing).  Must return
   an integer (int or long).

   Nouveau dans la version 2.5.

object.__coerce__(self, other)

   Called to implement « mixed-mode » numeric arithmetic.  Should
   either return a 2-tuple containing *self* and *other* converted to
   a common numeric type, or "None" if conversion is impossible.  When
   the common type would be the type of "other", it is sufficient to
   return "None", since the interpreter will also ask the other object
   to attempt a coercion (but sometimes, if the implementation of the
   other type cannot be changed, it is useful to do the conversion to
   the other type here).  A return value of "NotImplemented" is
   equivalent to returning "None".


3.4.9. Coercion rules
---------------------

This section used to document the rules for coercion.  As the language
has evolved, the coercion rules have become hard to document
precisely; documenting what one version of one particular
implementation does is undesirable.  Instead, here are some informal
guidelines regarding coercion.  In Python 3, coercion will not be
supported.

* If the left operand of a % operator is a string or Unicode object,
  no coercion takes place and the string formatting operation is
  invoked instead.

* It is no longer recommended to define a coercion operation. Mixed-
  mode operations on types that don’t define coercion pass the
  original arguments to the operation.

* New-style classes (those derived from "object") never invoke the
  "__coerce__()" method in response to a binary operator; the only
  time "__coerce__()" is invoked is when the built-in function
  "coerce()" is called.

* For most intents and purposes, an operator that returns
  "NotImplemented" is treated the same as one that is not implemented
  at all.

* Below, "__op__()" and "__rop__()" are used to signify the generic
  method names corresponding to an operator; "__iop__()" is used for
  the corresponding in-place operator.  For example, for the operator
  “"+"”, "__add__()" and "__radd__()" are used for the left and right
  variant of the binary operator, and "__iadd__()" for the in-place
  variant.

* For objects *x* and *y*, first "x.__op__(y)" is tried.  If this is
  not implemented or returns "NotImplemented", "y.__rop__(x)" is
  tried.  If this is also not implemented or returns "NotImplemented",
  a "TypeError" exception is raised.  But see the following exception:

* Exception to the previous item: if the left operand is an instance
  of a built-in type or a new-style class, and the right operand is an
  instance of a proper subclass of that type or class and overrides
  the base’s "__rop__()" method, the right operand’s "__rop__()"
  method is tried *before* the left operand’s "__op__()" method.

  This is done so that a subclass can completely override binary
  operators. Otherwise, the left operand’s "__op__()" method would
  always accept the right operand: when an instance of a given class
  is expected, an instance of a subclass of that class is always
  acceptable.

* When either operand type defines a coercion, this coercion is
  called before that type’s "__op__()" or "__rop__()" method is
  called, but no sooner.  If the coercion returns an object of a
  different type for the operand whose coercion is invoked, part of
  the process is redone using the new object.

* When an in-place operator (like “"+="”) is used, if the left
  operand implements "__iop__()", it is invoked without any coercion.
  When the operation falls back to "__op__()" and/or "__rop__()", the
  normal coercion rules apply.

* In "x + y", if *x* is a sequence that implements sequence
  concatenation, sequence concatenation is invoked.

* In "x * y", if one operand is a sequence that implements sequence
  repetition, and the other is an integer ("int" or "long"), sequence
  repetition is invoked.

* Rich comparisons (implemented by methods "__eq__()" and so on)
  never use coercion.  Three-way comparison (implemented by
  "__cmp__()") does use coercion under the same conditions as other
  binary operations use it.

* In the current implementation, the built-in numeric types "int",
  "long", "float", and "complex" do not use coercion. All these types
  implement a "__coerce__()" method, for use by the built-in
  "coerce()" function.

  Modifié dans la version 2.7: The complex type no longer makes
  implicit calls to the "__coerce__()" method for mixed-type binary
  arithmetic operations.


3.4.10. Gestionnaire de contexte With
-------------------------------------

Nouveau dans la version 2.5.

Un *gestionnaire de contexte* est un objet qui met en place un
contexte prédéfini au moment de l’exécution de l’instruction "with".
Le gestionnaire de contexte gère l’entrée et la sortie de ce contexte
d’exécution pour tout un bloc de code. Les gestionnaires de contextes
sont normalement invoqués en utilisant une instruction "with" (décrite
dans la section L’instruction with), mais ils peuvent aussi être
directement invoqués par leurs méthodes.

Les utilisations classiques des gestionnaires de contexte sont la
sauvegarde et la restauration d’états divers, le verrouillage et le
déverrouillage de ressources, la fermeture de fichiers ouverts, etc.

Pour plus d’informations sur les gestionnaires de contexte, lisez Le
type gestionnaire de contexte.

object.__enter__(self)

   Entre dans le contexte d’exécution relatif à cet objet.
   L’instruction "with" lie la valeur de retour de cette méthode à une
   (ou plusieurs) cible spécifiée par la clause "as" de l’instruction,
   si elle est spécifiée.

object.__exit__(self, exc_type, exc_value, traceback)

   Sort du contexte d’exécution relatif à cet objet. Les paramètres
   décrivent l’exception qui a causé la sortie du contexte. Si l’on
   sort du contexte sans exception, les trois arguments sont à "None".

   Si une exception est indiquée et que la méthode souhaite supprimer
   l’exception (c’est-à-dire qu’elle ne veut pas que l’exception soit
   propagée), elle doit renvoyer "True". Sinon, l’exception est
   traitée normalement à la sortie de cette méthode.

   Notez qu’une méthode "__exit__()" ne doit pas lever à nouveau
   l’exception qu’elle reçoit ; c’est du ressort de l’appelant.

Voir aussi:

  **PEP 343** - The « with » statement
     La spécification, les motivations et des exemples de
     l’instruction "with" en Python.


3.4.11. Special method lookup for old-style classes
---------------------------------------------------

For old-style classes, special methods are always looked up in exactly
the same way as any other method or attribute. This is the case
regardless of whether the method is being looked up explicitly as in
"x.__getitem__(i)" or implicitly as in "x[i]".

This behaviour means that special methods may exhibit different
behaviour for different instances of a single old-style class if the
appropriate special attributes are set differently:

   >>> class C:
   ...     pass
   ...
   >>> c1 = C()
   >>> c2 = C()
   >>> c1.__len__ = lambda: 5
   >>> c2.__len__ = lambda: 9
   >>> len(c1)
   5
   >>> len(c2)
   9


3.4.12. Special method lookup for new-style classes
---------------------------------------------------

For new-style classes, implicit invocations of special methods are
only guaranteed to work correctly if defined on an object’s type, not
in the object’s instance dictionary.  That behaviour is the reason why
the following code raises an exception (unlike the equivalent example
with old-style classes):

   >>> class C(object):
   ...     pass
   ...
   >>> c = C()
   >>> c.__len__ = lambda: 5
   >>> len(c)
   Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
   TypeError: object of type 'C' has no len()

La raison de ce comportement vient de certaines méthodes spéciales
telles que "__hash__()" et "__repr__()" qui sont implémentées par tous
les objets, y compris les objets types. Si la recherche effectuée par
ces méthodes utilisait le processus normal de recherche, elles ne
fonctionneraient pas si on les appelait sur l’objet type lui-même :

   >>> 1 .__hash__() == hash(1)
   True
   >>> int.__hash__() == hash(int)
   Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
   TypeError: descriptor '__hash__' of 'int' object needs an argument

Essayer d’invoquer une méthode non liée d’une classe de cette manière
est parfois appelé « confusion de méta-classe » et se contourne en
shuntant l’instance lors de la recherche des méthodes spéciales :

   >>> type(1).__hash__(1) == hash(1)
   True
   >>> type(int).__hash__(int) == hash(int)
   True

En plus de shunter les attributs des instances pour fonctionner
correctement, la recherche des méthodes spéciales implicites shunte
aussi la méthode "__getattribute__()" même dans la méta-classe de
l’objet :

   >>> class Meta(type):
   ...    def __getattribute__(*args):
   ...       print "Metaclass getattribute invoked"
   ...       return type.__getattribute__(*args)
   ...
   >>> class C(object):
   ...     __metaclass__ = Meta
   ...     def __len__(self):
   ...         return 10
   ...     def __getattribute__(*args):
   ...         print "Class getattribute invoked"
   ...         return object.__getattribute__(*args)
   ...
   >>> c = C()
   >>> c.__len__()                 # Explicit lookup via instance
   Class getattribute invoked
   10
   >>> type(c).__len__(c)          # Explicit lookup via type
   Metaclass getattribute invoked
   10
   >>> len(c)                      # Implicit lookup
   10

En shuntant le mécanisme de "__getattribute__()" de cette façon, cela
permet d’optimiser la vitesse de l’interpréteur moyennant une certaine
manœuvre dans la gestion des méthodes spéciales (la méthode spéciale
*doit* être définie sur l’objet classe lui-même afin d’être invoquée
de manière cohérente par l’interpréteur).

-[ Notes ]-

[1] Il *est* possible, dans certains cas, de changer le type d’un
    objet, sous certaines conditions. Cependant, ce n’est généralement
    pas une bonne idée car cela peut conduire à un comportement très
    étrange si ce n’est pas géré correctement.

[2] Pour des opérandes de même type, on considère que si la
    méthode originelle (telle que "__add__()") échoue, l’opération
    n’est pas autorisée et donc la méthode symétrique n’est pas
    appelée.
