- Certains objets définissent des actions de nettoyage standard qui sont effectuées lorsque l'objet n'est plus nécessaire, que l'opération et l'objet utilisé aient réussi ou non. Voir l'exemple suivant, qui tente d'ouvrir un fichier et d'afficher son contenu à l'écran :
pour la ligne dans open("myfile.txt") :
impression (ligne)
- Le problème avec ce code est qu'il laisse le fichier ouvert indéfiniment après l'exécution du code. Dans les scripts simples, ce n'est pas un problème, mais dans les grandes applications, cela peut devenir un problème. L'instruction avec vous permet d'utiliser des objets tels que des fichiers afin qu'ils soient toujours correctement et immédiatement nettoyés.
avec open("myfile.txt") comme f :
pour la ligne en f :
impression (ligne)
Après l'exécution de l'instruction, le fichier f est toujours fermé, même s'il y a eu un problème avec l'exécution des lignes. Les objets qui fournissent des actions de nettoyage par défaut, comme les fichiers, l'indiquent dans leur documentation.
Le
- Comparé à d'autres langages de programmation, le mécanisme de classes Python ajoute des classes avec un minimum de nouvelle syntaxe et de sémantique au langage. C'est un mélange des mécanismes des classes C++++ et Modula-3. Les classes Python fournissent toutes les propriétés standard de la programmation orientée objet : le mécanisme d'héritage de classe permet de multiples classes de base, une classe dérivée peut remplacer toute méthode de sa classe de base, et une méthode peut appeler la méthode de classe de base par le même nom. Les objets peuvent avoir n'importe quel numéro de série et type de données. Comme pour les modules, les classes ont aussi la nature dynamique de Python : elles sont créées au moment de l'exécution et peuvent être modifiées après la création.
- En terminologie C++++, les membres de la classe (y compris les membres de données) sont généralement en Python public (exceptions voir Variables privées) et toutes les fonctions des membres (méthodes) sont virtuelles. Comme dans Modula-3, il n'y a pas de raccourcis pour se référer aux attributs d'un objet à partir de ses méthodes : la méthode est déclarée avec un premier paramètre explicite représentant l'objet, puis passée implicitement sur appel. Ceci fournit la sémantique pour l'importation et le renommage. Contrairement à C++++ et Modula-3, les types de données embarquées peuvent être utilisés par l'utilisateur comme classes de base, c'est-à-dire dérivées. De plus, la plupart des opérateurs embarqués, comme en C++++, peuvent être redéfinis avec une syntaxe spéciale (opérateurs arithmétiques, indexation, etc.) pour les instances de classe.
(Puisqu'il n'y a pas de terminologie généralement acceptée pour les classes, je vais utiliser les termes Smalltalk et C++++ entre les deux. Je préférerais utiliser les termes Modula-3 parce que sa sémantique orientée objet est plus proche de Python que de C++++, mais j'espère que peu de lecteurs en ont entendu parler.)
Un mot sur les noms et les objets
Les objets ont une individualité et des noms différents (dans des domaines de validité différents) peuvent être liés au même objet. Dans d'autres langues, cela s'appelle l'aliasing. Ceci n'est généralement pas apprécié lorsque vous regardez Python pour la première fois et peut être facilement ignoré si vous travaillez avec des types de données immuables (nombres, chaînes, tuples). Mais l'aliasing peut avoir un effet surprenant sur la sémantique du code Python, qui contient des objets modifiables tels que des listes, des dictionnaires, ou bien d'autres types. Cela profite généralement au programme, puisque les alias se comportent d'une manière ou d'une autre comme des pointeurs. Par exemple, passer un objet est pratique parce qu'un seul pointeur est passé à travers l'implémentation. Si une fonction change un objet passé en argument, l'appelant verra le changement - ce qui évite d'avoir besoin de deux mécanismes de passage différents, comme en Pascal.
Buts et espaces de nommage en Python
Avant d'introduire des classes, vous devez parler des règles de Python concernant les buts. Les définitions de classes appliquent de jolis trucs aux espaces de noms, et vous devez savoir comment les buts et les espaces de noms fonctionnent pour bien comprendre ce qui se passe. En outre, la connaissance de ceci est utile pour n'importe quel programmeur Python avancé.
Commençons par quelques définitions.
Un espace-nom est une attribution de noms à des objets. La plupart des espaces de nommage sont actuellement implémentés sous forme de dictionnaires, mais cela n'est généralement pas perceptible (sauf pour les performances) et peut changer à l'avenir. Exemples d'espaces de noms : L'ensemble des noms intégrés (contenant des fonctions telles que abs() et des exceptions intégrées), les noms globaux d'un module et les noms locaux d'un appel de fonction. D'une certaine manière, les attributs d'un objet forment également un espace de noms.