Le petit Python orienté objet
Programmation orientée objet avec Python 3
Richard Gomez
Ellipses
Prologue
5
1 Paradigme orienté objet
33
1.1 Introduction33
1.2 Objets et méthodes34
1.3 Notion de classe37
1.4 Héritage, surcharge et polymorphisme39
1.4.1 Héritage39
1.4.2 Surcharge40
1.4.3 Surcharge des opérateurs usuels43
1.4.4 Polymorphisme44
1.5 Agrégation et composition44
1.6 Méthodes d'instances, méthodes de classes et méthodes statiques46
1.7 Langage UML47
2 Mots réservés et fonctions internes orientés objet
51
2.1 Mots réservés orientés objet51
2.2 Données internes (module builtins)52
2.3 Données internes orientées objet54
3 Types offerts par Python
55
3.1 Introduction55
3.2 Catégories I et III56
3.3 Catégorie II : les types d'exceptions57
3.4 Catégories IV et V57
3.5 Interfaces offertes par Python58
3.6 Hiérarchie officielle des types internes59
3.7 Introspection60
4 Objets
63
4.1 Introduction63
4.2 Valeur64
4.2.1 Définition64
4.2.2 Valeur des objets de type interne65
4.2.2.1 Nombres65
4.2.2.2 Chaînes65
4.2.2.3 Booléens66
4.2.2.4 Conteneurs66
4.2.2.5 Objets de type object66
4.2.3 Valeur d'une instance de classe67
4.2.4 Mécanisme derrière « == »68
4.3 Identité70
4.3.1 Définition70
4.3.2 Bizarrerie en coulisse70
4.3.3 Cas des objets mutables72
5 Classes
75
5.1 Classes chez Python75
5.2 Créer une classe75
5.3 Variables d'une classe (attributs)76
5.3.1 Définition76
5.3.2 Attributs-données et attributs-méthodes78
5.3.3 Identificateurs recommandés79
5.3.4 Dictionnaire _ _dict_ _80
5.4 Instancier une classe81
5.5 Méthodes82
5.6 Filiation et héritage83
5.7 Attributs name et qualname86
5.8 Fonction type88
5.9 Docstring89
5.10 Attribut slots90
5.11 Décorer une classe93
5.12 Introspection93
5.12.1 Afficher les parents d'une classe93
5.12.2 Retour au dictionnaire94
5.12.3 Une bizarrerie avec les attributs privés95
6 Méthodes
97
6.1 Méthodes d'instances97
6.2 Méthodes de classes98
6.3 Méthodes statiques99
6.4 Cas d'utilisation100
6.4.1 Généralités100
6.4.2 Exemples internes101
6.4.2.1 float . fromhex101
6.4.2.2 int . from_bytes102
6.4.2.3 str . maketrans102
6.4.2.4 dict . fromkeys103
6.4.2.5 bytearray . fromhex103
6.4.2.6 bytes. fromhex104
6.4.3 Cas des fonctions d'un module104
6.4.4 Exemples avec des matrices105
6.4.5 Exemples avec des dates108
6.5 Introspection110
6.5.1 Explorer method110
6.5.2 Explorer classmethod111
6.5.3 Explorer staticmethod113
6.6 Bilan115
7 Type object
117
7.1 Introduction117
7.2 Exploration rapide118
7.3 Attributs basiques119
7.3.1 Attribut _ _name _ _119
7.3.2 Attribut _ _qualname_ _119
7.3.3 Attribut _ _bases_ _119
7.3.4 Attribut _ _dict_ _120
7.4 Méthodes pour instancier121
7.4.1 Méthode _ _new_ _121
7.4.2 Méthode _ _init_ _123
7.5 Méthodes pour afficher125
7.5.1 Méthode _ _repr_ _125
7.5.2 Méthode _ _str_ _125
7.5.3 Méthode format125
7.6 Méthodes pour comparer126
7.7 Attributs pour introspection127
7.7.1 Attribut _ _class_ _127
7.7.2 Attribut _ _doc_ _128
7.7.3 Méthode _ _dir_ _128
7.7.4 Méthode _ _sizeof_ _129
7.8 Méthodes accesseur, imitateur et effaceur129
7.9 Attributs liés à l'héritage130
7.9.1 Méthode mro130
7.9.2 Attribut _ _mro_ _130
7.9.3 Méthode _ _subclasses_ _131
7.10 Méthode pour hacher131
7.11 Curiosités132
7.11.1 Mise en abyme132
7.11.2 Bound ou unbound ?133
7.11.3 Retour à l'espace des noms de object135
7.11.4 Retour à subclasses136
7.11.5 Retour à mro137
7.11.6 Dernier coup d'oeil138
8 Type function
139
8.1 Paramètres139
8.1.1 Introduction139
8.1.2 Paramètres de position sans valeur par défaut140
8.1.3 Paramètres nommés sans valeur par défaut140
8.1.4 Paramètres positionnels ou nommés sans valeur par défaut140
8.1.5 Paramètres avec valeur par défaut140
8.1.6 Paramètre var-positional141
8.1.7 Paramètre var-keyword141
8.1.8 Signatures142
8.1.9 Valeur par défaut et effet de bord145
8.2 Arguments146
8.3 Exemple : émulation de max148
8.4 Expérience150
8.5 Passage par valeur, variable ou référence ?150
8.6 Attributs spécifiques151
8.6.1 _ _name_ _152
8.6.2 _ _qualname_ _152
8.6.3 _ _doc_ _152
8.6.4 _ _annotations_ _153
8.6.5 _ _module_ _153
8.6.6 _ _globals_ _153
8.6.7 _ _defaults_ _153
8.6.8 _ _kwdefaults_ _154
8.6.9 __ _closure_ _154
8.6.10 _ _code_ _154
8.7 Distanciation154
8.8 Ajouter des attributs à une fonction156
8.9 Fermeture d'une fonction158
8.9.1 Notion de variable libre158
8.9.2 Contenu de la fermeture159
8.9.3 Calcul de la fermeture160
8.9.4 À quoi sert la fermeture ?162
8.9.5 Quelques exemples amusants163
8.9.6 Retour à une ancienne énigme165
8.9.7 Émuler une classe avec une fonction166
8.9.8 Conclusion168
8.10 Annotations168
8.10.1 Introduction168
8.10.2 Module typing169
8.10.3 Annotations contraignantes171
8.10.3.1 Fonction checktypes171
8.10.3.2 Fonction ensure_annotations du module ensure172
8.10.3.3 Fonction validate172
9 Constructeurs et initialiseurs
175
9.1 Préliminaire175
9.2 Mécanisme d'instanciation175
9.3 Constructeurs178
9.4 Pourquoi les constructeurs sont des méthodes statiques ?180
9.5 Initialiseurs183
9.5.1 Introduction183
9.5.2 Appel de l'initialiseur184
9.5.3 Utilisation courante184
9.5.4 Exemple185
9.5.5 Dérivation et Coopération185
9.5.6 Confusion fréquente188
9.6 Manipulations188
9.7 Instanciation des types internes193
9.7.1 Cas des objets mutables193
9.7.2 Cas des objets non mutables194
9.7.3 Cas des classes195
9.8 Cas courants où l'on surcharge le constructeur196
9.8.1 Dérivation d'un type interne d'objets non mutables196
9.8.2 Dérivation de la classe type198
9.9 Application à des design patterns200
9.9.1 Singleton200
9.9.2 Borg203
9.9.3 Compteur d'instances206
10 Destructeurs et ramasse-miettes
209
10.1 Mot réservé del209
10.2 Destructeur (finalizer)210
10.3 La commande del est-elle utile ?215
10.4 Exemple : retour au design pattern compteur216
11 Espaces de noms
219
11.1 Introduction219
11.2 Opérations sur les variables220
11.3 Espace des noms internes221
11.4 Espace des noms globaux221
11.5 Espace de noms locaux222
11.5.1 Introduction222
11.5.2 Variable globale et variable locale pointant vers le même objet . . .223
11.5.3 Paramètres avec valeur par défaut224
11.6 Résolution d'un nom dans le corps d'une fonction225
11.7 Espace des noms associé à une classe228
11.8 Espace des noms associé à une instance229
11.9 Vie et mort des variables d'une classe et d'une instance231
11.10 Résolution d'un nom dans le corps d'une classe233
11.10.1 Énoncé des règles233
11.10.2 Exemples235
11.10.3 Une fonction à l'intérieur d'une classe236
11.10.4 Curiosités238
11.11 Outils pour l'introspection240
11.11.1 Fonction dir240
11.11.2 Attribut _ _dict_ _241
11.11.3 Fonction globals241
11.11.4 Fonction locals241
11.11.5 Fonction vars242
11.12 Notion de portée (scope)242
11.13 À propos du tiret bas (underscore)243
12 Méthodes spéciales pour l'affichage
245
12.1 Méthode repr245
12.1.1 Introduction245
12.1.2 Penser à l'héritage246
12.1.3 Représentation basée sur l'identité246
12.1.4 Représentation des objets de type interne247
12.1.4.1 Cas de object247
12.1.4.2 Cas de classmethod, enumerate, filter, map, property, reversed, staticmethod et zip248
12.1.4.3 Cas de function248
12.1.4.4 Cas de memoryview249
12.1.4.5 Cas de super249
12.1.4.6 Cas de type250
12.1.4.7 Cas de method251
12.1.5 Représentation par défaut d'une instance de classe252
12.1.6 Une surcharge pratique pour débugger253
12.2 Méthode sfr254
12.2.1 Introduction254
12.2.2 Lien entre str et repr255
12.2.3 Cas des objets conteneurs de type interne257
12.3 Méthode format259
12.3.1 Introduction259
12.3.2 Mécanisme derrière la fonction format260
12.3.3 Mécanisme derrière str. format260
12.3.4 Surcharger format261
12.4 Exemple amusant262
13 None, Ellipsis et NotImplemented
265
13.1 Objet None265
13.1.1 Introduction265
13.1.2 Affichage266
13.1.3 Attributs266
13.1.4 Retour par défaut267
13.1.5 Utilisé comme valeur par défaut267
13.1.6 Utilisé pour désactiver une méthode héritée268
13.2 Objet Ellipsis268
13.2.1 Introduction268
13.2.2 Affichage269
13.2.3 Utilisation269
13.2.4 Exemple270
13.3 Objet NotImplemented272
13.3.1 Introduction272
13.3.2 Usage général272
13.3.3 Usage dans les opérateurs d'arité 2273
13.3.4 Ne pas confondre avec NotImplementedError275
14 Opérateurs d'arité 2
277
14.1 Notion d'opérateur symétrique277
14.2 Méthodes spéciales d'opérateurs278
14.3 Symétrique d'une méthode d'opérateur278
14.4 Mécanisme derrière les opérateurs arithmétiques279
14.5 Mécanisme derrière les opérateurs de comparaison280
14.5.1 Égalité et non égalité281
14.5.2 Ordre284
14.6 Opérateurs in situ (in place)286
14.7 Priorités288
14.8 Expériences288
14.8.1 Expérience 1288
14.8.2 Expérience 2289
14.8.3 Expérience 3289
14.8.4 Expérience 4290
14.8.5 Expérience 5291
14.8.6 Expérience 6291
15 Objets subscriptables
293
15.1 Définition293
15.2 Méthode getitem294
15.3 Méthode missing295
15.4 Méthode setitem297
15.5 Méthode delitem297
15.6 Opération « for k in x »298
15.7 Opération « k in a »299
15.8 Méthode spéciale index301
15.9 Exemple : matrices302
16 Slicing
305
16.1 Rappels305
16.1.1 Rudiments305
16.1.2 Syntaxes305
16.1.3 Robustesse du slicing306
16.2 Mécanisme derrière le slicing307
16.3 Objets de type slice309
16.4 Reconditionnement310
16.5 Méthode slice . indices311
16.6 Annexe : index312
17 Séquences
315
17.1 Définition315
17.2 Les séquences sont itérables316
17.3 Les séquences supportent l'opération « x in a »316
17.4 Slicing317
17.4.1 Rappels317
17.4.2 Exemple consistant318
17.4.3 Une autre version de cet exemple322
17.5 Concaténation et répétition323
17.6 Méthodes spéciales328
17.6.1 Tour d'horizon328
17.6.2 Méthode len328
17.6.3 Lien entre len et reversed329
17.6.4 Méthode reversed331
17.7 Méthodes typiques332
17.8 Exemple complet : séquences géométriques335
17.8.1 Introduction335
17.8.2 Slicing336
17.8.3 Changer la longueur et la raison338
17.8.4 Surcharge de setitem339
17.8.5 Surcharge de delitem340
17.8.6 Surcharge de méthodes typiques342
17.8.6.1 Surcharge de append342
17.8.6.2 Surcharge de extend343
17.8.6.3 Surcharge de copy344
17.8.6.4 Surcharge de index344
17.8.6.5 Surcharge de reverse345
17.8.6.6 Surcharge de pop345
17.8.7 Surcharge de add et iadd346
17.9 Exemple complet par dérivation347
17.9.1 Introduction347
17.9.2 Slicing349
17.9.3 Changer la longueur et la raison349
17.9.4 Surcharge de setitem350
17.9.5 Surcharge de delitem350
17.9.6 Surcharge de méthodes typiques352
17.9.6.1 Méthodes à éliminer353
17.9.6.2 Surcharge de append353
17.9.6.3 Surcharge de extend353
17.9.6.4 Surcharge de copy354
17.9.6.5 Pas besoin de surcharger index354
17.9.6.6 Pas besoin de surcharger reverse355
17.9.6.7 Surcharge de pop355
17.9.7 Surcharge de add et iadd356
18 Itérables
359
18.1 Définition359
18.2 Mécanisme derrière « for k in x »359
18.3 Cas particulier d'un objet muni de getitem360
18.4 Fonction iter363
18.5 Fonction next364
18.6 Surcharger iter et next : usage courant365
18.7 Itérateur versus pseudo-itérateur367
18.8 Exemples complets369
18.8.1 Suites de Syracuse369
18.8.2 Itérer sur un entier370
18.9 Émulation371
18.10 Décompression373
18.11 Opérateur splat373
18.12 Introspection374
18.13 Compléments sur iter et next375
18.13.1 Appel de iter avec une fonction et une sentinelle375
18.13.2 Appel de next avec valeur default377
18.14 Expériences377
18.15 En résumé378
19 Conteneurs
381
19.1 Définition381
19.2 Mécanisme derrière « k in x »381
19.3 Conteneurs de type interne382
19.4 Surcharge de contains : exemples simples383
19.4.1 Conteneur universel383
19.4.2 Conteneur très exotique383
19.4.3 Idéaux de Z384
19.5 Cas particulier des itérables infinis385
19.6 Émulation386
19.7 Exemples387
19.7.1 Retour à Syracuse387
19.7.2 Divisibilité chez les entiers388
19.7.3 Intervalles de R390
20 Tables de hachage
393
20.1 Introduction393
20.1.1 Définition393
20.1.2 Implémentation naïve des ensembles finis394
20.1.3 Ensemble naïf versus set395
20.1.4 Implémentation naïve des dictionnaires398
20.2 Hachage-adressage quand l'univers est fini399
20.2.1 Fonctionnement399
20.2.2 Émulation401
20.3 Hachage-adressage quand l'univers est infini403
20.3.1 Principe de base403
20.3.2 Traitement des collisions404
20.3.3 Exemple à la main405
20.3.4 Émulation406
20.3.5 Défauts410
20.3.5.1 Nécessité d'une bonne fonction de hachage410
20.3.5.2 Modélisation410
20.3.5.3 Paradoxe des anniversaires411
20.3.5.4 Clusters415
20.3.6 Variantes415
20.4 Tables de hachage de type interne417
20.4.1 Taille dynamique417
20.4.2 Collections d'objets ou de valeurs ?418
20.4.3 Objets hachables420
20.4.3.1 Généralités420
20.4.3.2 Récursivité421
20.4.3.3 Introspection421
20.4.4 Propriétés requises chez hash423
20.4.4.1 Être entier423
20.4.4.2 Être constant dans le temps423
20.4.4.3 Être invariant modulo eq424
20.4.4.4 Expérience de pensée : un hachage non invariant modulo eq424
20.4.4.5 Suivre une distribution uniforme427
20.4.5 Problème avec les mutables de type interne427
20.4.6 Classe-identités versus classe-valeurs429
20.4.7 Problème avec les classes-identités430
20.4.8 Problème avec les classes-valeurs432
20.4.9 Les 5 commandements436
20.5 Expériences436
20.5.1 Expérience 1436
20.5.2 Expérience 2437
20.5.3 Expérience 3437
20.5.4 Expérience 4438
20.5.5 Expérience 5439
20.5.6 Expérience 6439
20.5.7 Expérience 7440
20.6 Fonction interne hash441
20.6.1 Évolution de hash au fil du temps441
20.6.2 Python interdit qu'un hachage donne -1443
20.6.3 Définition de hash (n) pour n entier444
20.6.4 Émulation du hash de int445
20.6.5 Résidus et sommes digitales445
20.6.6 Émulation du hash de int avec des sommes digitales446
20.6.7 Compléments sur les opérateurs logiques (base 2)447
20.6.7.1 Répunit447
20.6.7.2 Opération AND447
20.6.7.3 Opération OR448
20.6.7.4 Opération XOR448
20.6.7.5 Décalage logique vers la gauche (left shift)448
20.6.7.6 Décalage logique vers la droite (right shift)449
20.6.8 Emulation du hash de int avec des opérateurs logiques449
20.6.9 Une remarque sur le nombre M61450
20.6.10 Émulation de la fonction interne hash451
20.6.11 Émulation du hash de str452
20.6.12 Émulation du hash de tuple454
20.6.13 Émulation du hash de Fraction454
20.6.14 Émulation du hash de float455
20.6.15 Émulation du hash de complexe456
20.6.16 Bibliothèque de hachage hashlib456
20.6.17 Expérience457
21 Ensembles
459
21.1 Introduction459
21.2 Méthodes typiques459
21.2.1 Méthodes de base459
21.2.2 Opérations460
21.2.3 Tests461
21.2.4 Mises à jour461
21.2.5 Autre462
21.3 Méthodes spéciales463
21.3.1 Méthodes spéciales de base463
21.3.2 Opérations464
21.3.3 Opérations in situ465
21.3.4 Comparaisons466
21.4 Exemple complet467
21.4.1 Méthodes de base467
21.4.2 Méthodes spéciales de base468
21.4.3 Opérations typiques469
21.4.4 Tests typiques470
21.4.5 Mises à jour470
21.4.6 Méthodes pop, clear et copy471
21.4.7 Opérateurs arithmétiques472
21.4.8 Opérateurs in situ472
21.4.9 Comparaisons472
21.5 Exemple avec des ensembles infinis473
22 Tables de correspondance
477
22.1 Introduction477
22.1.1 Première présentation477
22.1.2 Deuxième présentation478
22.1.3 Troisième présentation479
22.1.4 Quatrième présentation479
22.2 Méthodes courantes chez une table de correspondance479
22.2.1 Introspection dans dict480
22.2.2 Méthodes de base480
22.2.3 Mutations typiques481
22.2.3.1 Méthode update481
22.2.3.2 Méthode clear481
22.2.3.3 Méthodes pop et popitem482
22.2.4 Longueur et itération482
22.2.5 Méthodes items, keys et values482
22.2.6 Méthodes fromkeys483
22.2.7 Méthode copy483
22.3 Exemple complet484
23 Objets appelables
491
23.1 Définition491
23.2 Mécanisme derrière un appel491
23.3 Cas typiques493
23.3.1 Fonctions et méthodes493
23.3.2 Décorateurs gestionnaires de contexte493
23.3.3 Classes (émulation de call dans type)493
23.4 Emuler les fonctions numériques494
23.4.1 Fonctions réelles d'une variable réelle494
23.4.2 Fonctions réelles de plusieurs variables réelles497
23.5 Emuler les variables aléatoires499
23.5.1 Support fini499
23.5.2 Support dénombrable502
23.5.3 Support compact503
23.5.4 Support non compact505
23.5.4.1 Inversion de la fonction de répartition505
23.5.4.2 Cas de la loi normale506
24 Objets algébriques
509
24.1 Introduction509
24.2 Type bool509
24.3 Types int (et bool)511
24.3.1 Attributs typiques511
24.3.2 Méthodes typiques511
24.3.3 Méthode spéciale index512
24.3.4 Opérateurs typiques d'arité 2512
24.3.5 Opérateurs typiques d'arité 1513
24.3.6 Opérateurs bit à bit d'arité 2513
24.3.7 Opérateur bit à bit d'arité 1513
24.3.8 Opérateurs de comparaison513
24.3.9 Méthodes spéciales pour fonctions internes513
24.3.10 Méthodes spéciales pour fonctions du module math514
24.3.11 Implémentation514
24.4 Type float514
24.4.1 Attributs typiques514
24.4.2 Méthodes typiques514
24.4.3 Opérateurs typiques d'arité 2514
24.4.4 Opérateurs typiques d'arité 1515
24.4.5 Opérateurs de comparaison515
24.4.6 Méthodes spéciales pour fonctions internes515
24.4.7 Méthode spéciale pour la fonction trunc du module math515
24.4.8 Instances particulières515
24.4.9 Implémentation516
24.5 Type complex516
24.5.1 Instanciation516
24.5.2 Méthode typique517
24.5.3 Opérateurs typiques d'arité 2517
24.5.4 Opérateurs typiques d'arité 1517
24.5.5 Opérateurs de comparaison517
24.5.6 Méthodes spéciales pour fonctions internes517
24.6 Type decimal. Decimal517
24.6.1 Intérêt du type Decimal517
24.6.2 Notion de contexte519
24.6.3 Signaux, flags et traps520
24.6.4 Méthodes d'un objet de type Context521
24.6.5 Méthodes d'un objet de type Decimal521
24.6.6 Instances particulières521
24.7 Type fractions . Fraction522
24.7.1 Introduction522
24.7.2 Attributs et méthodes522
24.8 Classe abstraite Number523
24.9 Priorités entre opérateurs524
24.10 Classe algébrique en général524
24.11 Dériver un type numérique526
24.12 Exemple : quaternions527
24.13 Exemple : permutations533
24.14 Exemple : vecteurs537
24.15 Exemple : fonctions et variables aléatoires541
24.15.1 Retour aux fonctions réelles d'une variable réelle541
24.15.2 Retour aux variables aléatoires réelles541
25 Gestionnaires de contexte
545
25.1 Introduction545
25.2 Signature de enter et exit546
25.3 Gestionnaire customisé548
25.4 Gestionnaire-décorateur549
26 Héritage
553
26.1 Taxonomie et notion d'héritage553
26.2 Ordre de résolution d'un attribut (MRO)556
26.2.1 Linéarisation556
26.2.2 Position du problème557
26.2.3 Ordre local558
26.2.4 Depth first558
26.2.5 From left to right, depth first : LRDF559
26.2.6 Monotonie560
26.2.7 Algorithme LRDF amélioré : Keep last LRDF561
26.2.8 Exemple fâcheux562
26.2.9 Solution adoptée par Python 3563
26.3 Algorithme C3564
26.4 Superclasse569
26.4.1 Ne pas confondre les superclasses avec la superclasse569
26.4.2 Fonction super570
26.5 Un peu d'histoire571
26.5.1 Python 2.1571
26.5.2 Python 2.2 : arrivée des classes modernes572
26.5.3 Python 2.3 : adoption de l'algorithme C3575
27 Fonction super
577
27.1 Notion de superclasse577
27.2 Fonction super578
27.3 Utilisation élémentaire580
27.4 Utilisation un peu moins élémentaire582
27.5 Classes coopératives583
27.5.1 Introduction583
27.5.2 Signature robuste586
27.5.3 Stopper la chaîne des délégations587
27.6 Adaptateur588
27.7 Exemple complet589
27.8 Introspection594
27.9 Émulation598
28 Projet : dans la savane
601
28.1 Objectif601
28.2 Population globale601
28.3 Classe origine602
28.4 Êtres vivants, faune et flore603
28.5 Programme principal606
28.6 Enrichissements607
29 Méthodes spéciales derrière les accesseurs
609
29.1 Introduction609
29.2 Fonctions getattr, setattr, delattr et hasattr610
29.3 Méthode getattribute611
29.3.1 Introduction611
29.3.2 Exemple de surcharge612
29.3.3 Attention aux appels récursifs613
29.3.4 Accesseur de object613
29.3.5 Émulation de l'accesseur de object617
29.4 Méthode getattr618
29.5 Méthode setattr619
29.5.1 Fonctionnement619
29.5.2 Émulation du mutateur de object621
29.6 Méthode delattr623
29.6.1 Fonctionnement623
29.6.2 Émulation de l'effaceur de object624
29.7 Surcharger dir625
30 Descripteurs
627
30.1 Introduction627
30.1.1 Définition627
30.1.2 Méthode get628
30.1.3 Méthode set630
30.1.4 Méthode delete631
30.1.5 Méthode set name631
30.1.6 Protocole descripteur632
30.2 Cas des fonctions et méthodes632
30.2.1 Fonctions632
30.2.2 Méthodes d'instances634
30.2.3 Méthodes statiques636
30.2.4 Méthodes de classes637
30.3 Cas d'un member descriptor (slots)639
30.4 Cas d'un getset descriptor640
30.5 Utilisations élémentaires643
30.5.1 Première expérience643
30.5.2 Deuxième expérience644
30.5.3 Troisième expérience645
30.6 Utilisation de set name646
30.7 Validateurs647
30.8 Propriétés648
30.9 Émulation totale649
30.10 Retour au problème de bound versus unbound658
31 Type property
661
31.1 Introduction661
31.2 Application simpliste663
31.3 Méthodes getter, setter et deleter663
31.4 Émulation665
32 Métaclasses
667
32.1 Définitions667
32.2 Dériver type668
32.2.1 Usage courant : surcharger new668
32.2.2 Alternative : surcharger init669
32.3 Instancier une métaclasse669
32.3.1 Appel direct670
32.3.2 Mot-clé class avec paramètre metaclass670
32.4 À propos du paramètre metaclass671
32.4.1 Avec quoi alimenter ce paramètre ?671
32.4.2 Avec un objet possédant une méthode call671
32.4.3 Avec une fonction672
32.5 Exemple673
32.6 Attributs mro et mro674
32.7 Émulation du call de type674
32.8 Méthode init subclass675
32.8.1 Introduction675
32.8.2 Signature676
32.8.3 Exemple amusant677
32.8.4 Nature677
32.8.5 Émulation678
32.9 Méthodes instancecheck et subclasscheck679
32.9.1 Méthode spéciale derrière isinstance679
32.9.2 Méthode spéciale derrière issubclass680
32.9.3 Cas typique681
32.9.4 Introspection682
33 Classes abstraites (abc)
685
33.1 Définition685
33.2 Métaclasse ABCMeta du module abc685
33.3 Classe ABC687
33.4 Décorateur abstractmethod688
33.5 Décorateurs obsolètes689
33.6 Méthode register690
33.7 Surcharge de subclasscheck dans ABCMeta692
33.8 Surcharge de instancecheck dans ABCMeta693
33.9 Méthode subclasshook693
33.10 Cas courants695
33.11 Exemple : classe abstraite des validateurs699
33.12 Module collections. abc701
33.13 Module numbers703
34 Aide-mémoire méthodes spéciales
705
34.1 Instanciation et destruction705
34.2 Dérivation705
34.3 Espaces de noms705
34.4 Affichage705
34.5 Comparaisons706
34.6 Opérateurs arithmétiques706
34.6.1 Arité 1706
34.6.2 Arité 2706
34.7 Valeur booléenne707
34.8 Subscriptables707
34.9 Conteneurs et séquences707
34.10 Itérables707
34.11 Hachables707
34.12 Ensembles707
34.13 Tables de correspondance708
34.14 Appelables708
34.15 Objets algébriques708
34.16 Gestionnaires de contexte708
34.17 Accesseurs709
34.18 Descripteurs709
34.19 Introspection709
34.20 Autres méthodes709
34.20.1 Méthode bytes709
34.20.2 Méthode length hint710
34.20.3 Méthode pour objets asynchrones710
34.20.4 Divers710
34.21 Créer ses propres méthodes spéciales711
35 Threading
715
35.1 Notion de fil d'exécution715
35.2 Fils d'exécution simultanés717
35.3 Dériver la classe Thread718
35.4 Attribut de type Thread721
35.5 Synchroniser des fils avec des instances de Lock721
35.6 Méthode join724
35.7 Fonctions utiles726
35.8 Introspection727
35.9 Parallélisme728
36 Réseaux
731
36.1 Protocoles et ports731
36.2 Notion de socket732
36.2.1 Connecteur732
36.2.2 Famille et genre733
36.2.3 Signature de socket733
36.2.4 Adresses734
36.3 Principes de base734
36.4 Émettre et recevoir736
36.5 Mise en pratique737
36.5.1 Manipulations élémentaires737
36.5.2 Conseils pratiques741
36.5.3 Connecter deux ordinateurs à travers le réseau Internet742
36.6 Envoyer une requête à un serveur HTTP743
36.7 Expérience avec le navigateur746
36.8 Recommandations officielles748
36.8.1 Aléas du réseau748
36.8.2 Messages de longueurs fixes748
36.8.3 Messages indiquant leurs longueurs749
36.8.4 Méthode sendall751
36.8.5 Conclusion751
36.9 Chat rudimentaire (ping-pong)751
36.9.1 Client752
36.9.2 Serveur752
36.10 Les sockets sont des gestionnaires de contexte753
36.11 Fonction select755
36.12 Messagerie instantanée757
36.12.1 Position du problème757
36.12.2 Chat avec select et setblocking758
36.12.3 Chat avec Thread761
36.12.4 Chat avec Thread 100 % orienté objet764
36.12.5 Conclusion768
36.13 Fonctions pour retrouver un ip ou une adresse768
36.14 Compléments770
36.14.1 Attributs d'un Socket770
36.14.2 Méthode fileno771
36.14.3 Méthodes getsockname et getpeername771
36.14.4 Méthode sendfile772
36.14.5 Méthodes gettimeout et settimeout773
36.14.6 Méthode getblocking773
36.14.7 Méthode shutdown773
36.14.8 Erreurs de connexion775
37 Annexe : listes chaînées
777
37.1 Pointeurs777
37.2 Notion de liste simplement chaînée781
37.2.1 Définition781
37.2.2 Méthodes courantes782
37.2.3 Implémentation classique (Pascal)783
37.3 Émulation des listes simplement chaînées784
37.4 Émulation du type list789
37.5 Notion de liste doublement chaînée792
38 Annexe : complément à 2
795
38.1 Préliminaire795
38.2 Complément à 2 dans le cas de 4 bits795
38.3 Trouver la valeur représentée796
38.4 Généralisation à n bits796
38.5 Arithmétique797
38.6 Émulation797
38.7 Involution799
38.8 Petite astuce800
38.9 Retour à Python800
38.10 Opérateur ~ d'inversion801
38.11 Réciproques de bin, oct et hex801
39 Annexe : module urllib
805
39.1 Présentation du paquet805
39.2 Notion de URL805
39.3 Récupérer une ressource sur le web806
39.4 Requête HTTP GET806
39.5 Requête HTTP POST808
39.5.1 Introduction808
39.5.2 Requête écrite à la main809
39.5.3 Fonction Request810
39.6 Exemple amusant811
39.7 Entête813
39.8 Attributs d'un objet requête814
39.9 Attributs d'un objet réponse816
39.10 Gestion des erreurs817
39.11 Autres modules819
Bibliographie
821
Index
823