Le livre «Comment Python fonctionne. Guide pour les développeurs, les programmeurs et les personnes intéressées »

image Bonjour habrozhiteli! Nous avons récemment publié un nouveau livre sur Python. Nous vous proposons de vous familiariser immédiatement avec le matériel d'enquête.

Extrait. 7.4. Utiliser IDLE


Puisque IDLE inclut REPL, vous pouvez entrer le code ci-dessus et l'analyser directement dans le REPL. Cependant, vous pouvez également écrire du code, l'exécuter et l'analyser à partir de REPL. Pour essayer cette fonctionnalité, ouvrez un nouveau fichier et incluez-y le code suivant:

name = "Matt" first = name age = 1000 print(id(age)) age = age + 1 print(id(age)) names = [] print(id(names)) names.append("Fred") print(id(names)) 

Enregistrez le code dans un fichier appelé iden.py. Exécutez le fichier. Dans IDLE, appuyez sur la touche F5 pour ce faire. Quatre nombres seront affichés dans REPL. Les deux premiers seront différents; cela suggère que l'entier est immuable. Les deux derniers chiffres sont identiques. En effet, malgré la modification de la liste des noms, l'identifiant reste le même. En général, ce fait n'a rien de fondamentalement nouveau.

Maintenant, la chose la plus intéressante: si vous entrez la commande dir () dans REPL, elle affichera une liste de variables. Vous verrez que les variables globales de iden.py sont maintenant disponibles.

REPL dans IDLE donne accès à toutes les variables globales. Vous pouvez rechercher le nom et les noms et même appeler des fonctions ou des méthodes - par exemple, names.append ("George").

Ayant la possibilité d'étudier les résultats du code qui vient d'être exécuté, vous pouvez rapidement analyser le code et l'expérimenter. Les développeurs Python expérimentés écrivent souvent du code dans REPL, le collent dans un fichier, réexécutent le fichier, écrivent du nouveau code dans REPL et continuent à écrire du code de cette manière.

image

image

image

Extrait. 22. Sous-classement


En plus de regrouper l'état et les opérations, les classes fournissent également la réutilisation du code. Si vous avez déjà une classe et que vous avez besoin d'une autre classe qui a un comportement légèrement différent, une façon de réutiliser est de sous-classer. La classe à partir de laquelle la sous-classe est effectuée est appelée la super-classe (un autre nom commun pour la super-classe est la classe parente).

Supposons que vous souhaitiez créer une chaise pouvant accueillir six skieurs. Pour créer la classe Chair6, qui simule une chaise pour six personnes, une version plus spécialisée de Chair, vous pouvez utiliser le sous-classement. Les sous-classes permettent au programmeur d'hériter des méthodes des classes parentes et de remplacer les méthodes qui doivent être modifiées.

Voici la classe Chair6, qui est une sous-classe de CorrectChair:

 >>> class Chair6(CorrectChair): ... max_occupants = 6 

Remarque: la classe parent de CorrectChair est placée entre parenthèses après le nom de la classe. Notez que Chair6 ne définit pas de constructeur dans son corps, cependant vous pouvez créer des instances de la classe:

 >>> sixer = Chair6(76) 

Comment Python crée-t-il un objet si aucun constructeur n'est défini dans la classe? Voici ce qui se passe: lorsque Python recherche la méthode .__ init__, la recherche commence par Chair6. Étant donné que la classe Chair6 ne contient que l'attribut max_occupants, Python ne trouvera pas la méthode .__ init__ ici. Mais puisque Chair6 est une sous-classe de CorrectChair, il a l'attribut __bases__ listant les classes de base résumées dans le tuple:

image

image

 >>> Chair6.__bases__ (__main__.CorrectChair,) 

Ensuite, Python recherche le constructeur dans les classes de base. Il trouve le constructeur dans CorrectChair et l'utilise pour créer une nouvelle classe.

La même recherche se produit lors de l'appel de .load pour une instance. L'instance n'a pas d'attribut correspondant au nom de la méthode, donc Python vérifie la classe d'instance. Chair6 n'a pas non plus de méthode .load, donc Python recherche un attribut dans la classe de base CorrectChair. Ici, la méthode .load est appelée avec une valeur trop grande, ce qui entraîne une erreur ValueError:

 >>> sixer.load(7) Traceback (most recent call last): File "/tmp/chair.py", line 30, in <module> sixer.load(7) File "/tmp/chair.py", line 13, in load new_val = self._check(self.count + number) File "/tmp/chair.py", line 23, in _check number)) ValueError: Invalid count:7 

Python trouve la méthode dans la classe de base, mais l'appel de la méthode ._check entraîne une erreur ValueError.

22.1. Comptage s'arrête


Parfois, le skieur ne monte pas correctement dans l'ascenseur. Dans de tels cas, l'opérateur ralentit ou arrête la remontée pour aider le skieur. Nous pouvons utiliser Python pour créer une nouvelle classe qui comptera le nombre de ces arrêts.

Supposons que chaque appel à .load appelle une fonction qui renvoie une indication logique indiquant si un arrêt s'est produit ou non. Dans les paramètres de la fonction, le nombre de skieurs et l'objet chaise sont transférés.

Voici la classe qui obtient la fonction is_stalled dans le constructeur. Cette fonction sera appelée chaque fois que .load est appelé:

 >>> class StallChair(CorrectChair): ... def __init__(self, id, is_stalled): ... super().__init__(id) ... self.is_stalled = is_stalled ... self.stalls = 0 ... ... def load(self, number): ... if self.is_stalled(number, self): ... self.stalls += 1 ... super().load(number) 

Pour créer une instance de cette classe, vous devez fournir la fonction is_stalled. La fonction simple suivante génère des arrêts dans 10% des cas:

 >>> import random >>> def ten_percent(number, chair): ... """Return True 10% of time""" ... return random.random() < .1 

Vous pouvez maintenant créer une instance en spécifiant la fonction ten_percent comme paramètre is_stalled:

 >>> stall42 = StallChair(42, ten_percent) 

22.2. super


Souvenez-vous que StallChair définit sa propre méthode .__ init__, qui est appelée lors de la création d'une instance. Remarque: la première ligne du constructeur ressemble à ceci:

 super().__init__(id) 

Lorsque vous appelez super à l'intérieur de la méthode, vous avez accès à la classe parent correcte.

Une ligne dans le constructeur vous permet d'appeler le constructeur CorrectChair. Au lieu de répéter la logique d'attribution des attributs id et count, vous pouvez utiliser la logique de la classe parente. Étant donné que StallChair possède des attributs supplémentaires qui doivent être définis pour l'instance, cela peut être fait après avoir appelé le constructeur parent.

image

La méthode .load contient également un appel à super:

 def load(self, number): if self.is_stalled(number, self): self.stalls += 1 super().load(number) 

Dans la méthode .load, vous appelez la fonction is_stalled pour déterminer si l'ascenseur s'est arrêté, puis transférez le contrôle de la fonctionnalité .load d'origine à partir de CorrectChair à l'aide de super.

Placer le code commun en un seul endroit (dans la classe de base) réduit le nombre d'erreurs et la duplication de code.

À propos de l'auteur


Matt Harrison utilise Python depuis 2000. Il dirige MetaSnake, une société de conseil et de formation en entreprise en Python et en théorie de l'analyse de données. Dans le passé, il a travaillé dans les domaines de la recherche, de la gestion de l'assemblage et des tests, de l'intelligence d'affaires et du stockage de données.

Il a donné des présentations et des conférences de formation lors de conférences telles que Strata, SciPy, SCALE, PyCON et OSCON, ainsi que lors de conférences locales d'utilisateurs. La structure et le matériel de ce livre sont basés sur son expérience pratique dans l'enseignement du Python. Matt publie périodiquement des informations utiles sur Python sur Twitter (@__mharrison__).

Rédacteurs scientifiques


Roger A. Davidson est actuellement doyen du département de mathématiques de l'American River College à Sacramento, en Californie. Sa thèse de doctorat a été écrite sur le thème de l'ingénierie aérospatiale, mais il détient également des diplômes en éducation en informatique, en génie électrique et des systèmes, et a récemment reçu un certificat en science des données (qui a commencé sa fascination pour Python). Tout au long de sa carrière, Roger a travaillé pour la NASA, pour des sociétés Fortune 50, des startups et des collèges communautaires. Il est passionné par l'éducation, la science (pas seulement le traitement des données), les tartes aux mûres et le leadership d'équipes hétérogènes dans la résolution de gros problèmes.

Andrew McLaughlin (AndrewMcLaughlin) - programmeur et concepteur, administrateur système le matin et père de famille l'après-midi. En raison de son souci du détail, il est impliqué dans la programmation Web depuis 1998. Gagnant des honneurs de l'Université George Fox, Andrew est titulaire d'un diplôme en gestion et systèmes d'information. Dans ses temps libres, il part en camping avec sa femme et ses deux enfants, et travaille parfois dans un atelier de menuiserie (tous les doigts sont toujours en place). Lisez ses messages Twitter: @amclaughlin.

»Plus d'informations sur le livre sont disponibles sur le site Web de l'éditeur
» Contenu
» Extrait

Pour Habrozhitelami un rabais de 20% sur le coupon - Python .

Source: https://habr.com/ru/post/fr433534/


All Articles