Takuma

 tutoriel Python : Découvrons les classes

Recommended Posts

 

Niveau requis : Intermédiaire

Temps estimé : Entre 30 à 35 minutes

 

Bonjour.

 

Après une longue inactivité sur le forum, il est temps pour moi de reprendre du service. Je vais m'efforcer lors de ce tutoriel de vous apprendre tout ce qu'il y a à savoir sur les classes en Python. Je ne rentrerait pas dans le python trop avancé afin que tous les niveaux intermédiaires en Python puissent suivre ce tutoriel.

 

Ce tutoriel s'adresse à toutes les personnes qui voudraient apprendre le Python, ou aux personnes qui travaillent sur Metin2 par exemple : Metin2 emploie beaucoup de classe; il est donc essentiel de connaitre leur fonctionnement afin de pouvoir créer du contenu à sa guise.

 

J'essayerai au maximum de vous apprendre directement un code qui respecte les conventions, j'espère ne pas faire d'erreur... A vrai dire, il y en a énormément, et personne n'est à l'abris de ne pas tous les respecter.

 

Pré-requis:

Comme précisé ci-haut, je ne vais pas faire de Python trop avancé ici, cependant je considère que les personnes suivant ce petit guide ont un niveau intermédiaire c'est à dire qu'elles ont des connaissances en :

  • Fonctions;
  • Attributs;
  • Portée de variable.

 

Le reste peut vous être utile, mais je vais essayer de vous l'apprendre également.

 

 

I - Introduction aux classes :

 

Rangez votre éditeur de code, pour le moment nous allons discuter ! Effectivement, cela ne servirait à rien de commencer à programmer sans vous expliquer concrètement à quoi servent les classes et quelles sont leurs principales caractéristiques. Avant de commencer, je tiens à préciser que ceux qui pensent être à l'abris de lire tout le tutoriel car ils ont déjà des connaissances dans d'autres langages : mauvaise idée. Chaque langage de programmation à sa propre méthode, sa propre philosophie pour les objects.

 

Les classes ne sont pas que des boites dans les quelles vous pouvez mettre des fonctions où des variables, les classes sont la base de la Programmation Orientée Objet (POO). En réalité en Python, vous utilisez des objects depuis longtemps. Pour citer Mathieu Nebra : "En python, tout est objet". Une liste par exemple, est un objet, et non réellement une variable.

 

Créer une classe permet de créer de nouveaux objets et de nouvelles instances avec ses propres attributs. Ne paniquez pas, nous allons définir ces termes au fil du guide.

 

Par défaut les objets sont publics (sauf mention contraire : private), et toutes les fonctionnalités des classes sont virtuelles.

 

 

II - La portée des variables :

Nous attaquons ici un paragraphe que je vais vite résumer, mais ne le négligez surtout pas, c'est un des points les plus importants de ce guide. Les portées sont définies de manières statiques, mais sont utilisées de manières dynamiques. En réalité nous pouvons découper les portées Python en 4 espaces (dites de nommage) qui définissent à eux quatre la plage de nommage. Pour simplifier la compréhension de ces espaces je vous conseille d'utiliser une métaphore : les poupées russes. Imaginez qu'une poupée ne peut voir que ce qu'elle contient : Si on imbrique une poupée dans une plus grande (respectivement la poupée A et B), la poupée B pourra voir A et tout ce qu'elle peut voir. Cependant A ne verra pas ce que contient B. Voici une liste de ces 4 espaces :

  • Une portée dite centrale : elle contient les noms locaux. C'est à dire qu'ils ne sont accessibles nul part d'autre. 
  • Une portée dite  des fonctions englobante : c'est un espace entre le global et le local. Pour la définir au maximum nous allons dire qu'elle contient des éléments non-locaux, et exclusivement des éléments non-globaux.
  • Une portée dite intermédiaire : c'est l'avant-dernière portée, elle contient les noms globaux du module.
  • Une portée englobante : La vraie et l'unique, elle contient tout simplement tout. Elle est l'espace de nommage contenant toutes les primitives. 

La façon dont vous allez définir vos variables va déterminer dans quel espace de la plage de nommage elle va être renseignée.

 

En Python, si aucune instruction global n'est précisée, les affectations de noms vont dans la portée la plus proche. Ceci a une implication sur leur contenu et leur suppression, nous le verrons sûrement plus tard lors de ce guide.

 

Pour rendre une variable privée, vous devez faire précéder son nom de deux underscore comme ceci : __var.

 

III - Définir notre première classe :

Enfin ! Munissez vous de votre meilleur éditeur de code et de votre courage, nous allons enfin commencer à coder ! J'espère ne pas vous avoir perdu avant, car la difficulté va aller crescendo jusqu'à la fin de ce guide.

 

Vous pouvez définir une fonction absolument où vous voulez, cependant pour des soucis de clarté et de difficulté, je vais définir une classe directement dans le fichier.

 

Vous commencez à connaitre python, comme pour les fonctions, il existe un mot clé pour définir une classe, et il n'est rien d'autre que class. Voici sans plus attendre la définition de notre première fonction : 

052850Capture.PNG

 Ici, nous venons de définir une classe nommée FirstClass. Notez que pour les classes, nous n'utilisons pas d'underscore, et leur nom commence par une majuscule, ce qui permet de les différencier des fonctions par exemple.

 

 

IV - Remplissons notre classe avec des variables :

Dans notre classe, nous allons pouvoir mettre principalement deux éléments :

  • Les variables
    • Principales
    • D'instances
  • Les méthodes

Pour vous illustrez ceci, nous allons faire les choses dans le mauvais sens, nous allons commencer par les méthodes.

Vous le savez peut être : en Python, une méthode est extrêmement spéciale, la méthode d'initialisation. Elle se nomme toujours __init__. Les classes ne font pas exception à cette règle, la méthode d'initialisation de notre classe va être exécutée au moment où nous instancierons la classe. Ne vous inquiétez pas, nous allons illustrer ça très vite.

Notez que la méthode d'initialisation est aussi appelée le constructeur, il m'arrive d'utiliser les deux termes, ne soyez pas surpris. 

054335Capture.PNG

 

Vous pouvez remarquer qu'un mot est arrivé comme par magie, sans que j'en parle : self ! Tout d'abord le mot self n'est pas une réelle obligation, vous pourriez mettre "fe" à la place. Cependant, self est une convention forte. C'est à dire que même les codes review ne comprennent que self. Ensuite, self est l'instance en elle même. Nous pouvons accéder à ses méthodes par self.method.

 

Pour commencer avec les variables, nous allons en définir une qui sera la même pour toutes les instances car celle-ci ne sera pas définie par la biais du mot clé self :

055812Capture.PNG

Ici, notre variable language sera accessible partout, sans même instancier la classe. C'est à dire que n'importe où (où cette classe sera accessible), vous pourrez faire FirstClass.language qui vous retournera la chaîne de caractères "Python".

 

 Maintenant, passons au plus intéressant avec les variables : les variables d'instances. Pour cela, nous allons rajouter un paramètre à notre constructeur, par exemple :  name qui contiendra le nom de la personne qui instancie la classe. Modifions notre code comme ceci : 

050355Capture.PNG

 

Ici, nous allons faire un point pour vous expliquer comment tout cela fonction. Si vous demandez à Python de print : FirstClasse.language celui-ci vous renverra bien Python. Cependant pour connaitre name, nous devons déjà la préciser, et pour cela, nous devons instancier la classe. Il serait peut-être temps de vous apprendre à le faire ! 

Pour instancier une classe en python, vous allez stocker l'instance, l'objet renvoyer comme une variable, comme ceci :  var = FirstClass("Takuma").

051230Capture.PNG

(Renvoie dans la console : Takuma)

 

 

V - Remplissons notre classe avec des méthodes :

Pour cette partie, je vous propre de repartir d'une nouvelle classe. Nous allons essayer de faire une class "identity" qui permettra de générer une mini carte d'identité contenant :

  • Le nom : Ajouté dans le constructeur en paramètre
  • Son âge : Ajouté par une méthode
  • Son pays : ajouté par une fonction également

 

Voici la structure de notre fonction avec exclusivement ce que nous avons vu pour le moment : 

061307Capture.PNG

 

Bien, nous allons maintenant ajouter une méthode permettant d'ajouter l'âge de la personne. Pour cela, nous allons créer une méthode la même manière que les fonctions que vous créiez en dehors des classes. Celle-ci tout comme le constructeur prendra en premier paramètre notre instance self et en deuxième paramètre l'âge de la personne. Nous lui demanderons ensuite d'affecter cette valeur à notre variable d'instance "old", comme ceci :

062033Capture.PNG

 

Faisons de même pour le pays : 

062151Capture.PNG

 

Bien, pour finir cette partie, je vous propose d'ajouter une méthode permettant d'afficher le tout :

062557Capture.PNG

 

Je vous laissez donc un petit rendu, sachant que vous pouvez instancier plusieurs fois la classe dans plusieurs objets différent. Ici la variable identifier n'est pas utilisée.

062749Capture.PNG

Output : 

Identity :
        Name : Takuma
        Old: : 18
        Country: France

 

 

VI - Vers la programmation avancée :

J'achèverai ce tutoriel sur ce dernier chapitre qui vous permet d'explorer les possibilités qui s'offrent à vous avec les classes.

 

Cette partie va s'adresser aux plus avancés de vous, je vais parler d'héritage de metaclasse, effectivement le nom ne donne pas vraiment envie...

Ce principe est dur à aborder, mais simple et très puissant que on sait s'en servir, courage soldat !

1 - Héritage :

Le principe de l'héritage est d'utiliser des classes "entre" elles afin que certaines héritent, obtiennent les variables et les méthodes d'une autre. Je vais vous donner un exemple pour que vous compreniez mieux. 

 

Imaginons l'ensemble des êtres humains. Vous pouvez très bien créer une classe permettant d'instancier comme nous l'avons fait juste avant chaque personne. Cependant, imaginons que nous voulions mettre dans cette classe le travail de ce personnage, et les caractéristiques propres à ce travail. Il faudrait faire une classe entière par travail ? Arf, vous aussi vous sentez la répétition ? Eh bien c'est maintenant que l'héritage rentre en jeu ! Nous allons regrouper toutes les caractéristiques communes à toutes les personnes dans une classe d'abord, bien prenons quelques exemples comme la classe que nous avons définie juste avant : Nom, âge, pays. Pour simplifier la tâche, nous allons juste mettre une fonction init de dans :

060829Capture.PNG

 

Maintenant, nous allons créer une autre classe, par exemple : Banker qui va hérité des variables (méthodes également, mais il n'y en a pas dans Person pour que ce soit plus lisible). Banker contiendra par exemple le salaire de la personne, et son rang dans l'entreprise. Quand nous allons créer la classe, nous devrons ajouter en paramètre à la classe, la classe Person,, comme ceci :

061213Capture.PNG

 

Vous remarquerez que dans le constructeur de Banker, j'ai ajouté les paramètres de la class Person, c'est normal, nous allons instancier notre classe Person dans le constructeur de Banker. Pour cela nous avons deux choix : 

  • Faire directement référence à Person avec Personne.__init__();
  • Faire référence à la classe mère avec super.__init__();

Utilisons super() pour l'exemple.

062316Capture1.PNG

Attention, si vous décidez d'utiliser le nom de la classe directement, vous devrez passer le self en argument également, comme ceci :

062356Capture.PNG

 

On s'arrêtera ici, car ce n'est qu'une découverte, vous pouvez maintenant appeler les éléments définis dans Person par Banker, par exemple :

062520Capture.PNG

Renverra bien "Takuma" dans la console.

 

 

 

 

Voilà, on va s'arrêter là, je pense que vous avez un peu de lecture, merci pour ceux qui auront lu jusqu'au bout.

N'hésitez pas à me dire si quelque chose n'est pas clair pour vous, j'ai sorti ça d'une traite par manque de temps, je vais peut être remplacer les screens par des blocs codes par la suite, je sais pas ce qui rend le mieux, je vais voir.

 

 

Cordialement, Takuma.

  • Like 2

Share this post


Link to post
Share on other sites