Bonjour à tous,
En ce moment j'apprends le langage python, mais j'ai beaucoup de mal quant au concept de CLASSE. Quelqu'un aurait-il une explication moins abstraite et plus imagée pour le littéraire que je suis ?![]()
Bonjour à tous,
En ce moment j'apprends le langage python, mais j'ai beaucoup de mal quant au concept de CLASSE. Quelqu'un aurait-il une explication moins abstraite et plus imagée pour le littéraire que je suis ?![]()
Bonjour,
Homme est une classe, ie un genre/type d'objetTout homme est mortel.
aristote est un homme
donc aristote est mortel
Aristote est une instance de classe, <=> le genre de aristote est homme
<=> aristote a été construit, instancié, par la classe homme
mortel est un attribut de la classe humain (elle est commune à toutes les instances)
le nom "aristote" est un attribut de l'instance (elle varie avec l'instance)
En python:
Sinon, si tu connais Platon,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 class Homme: mortel = True def __init__(self,name): self.name= name someone= Homme("Aristote") someone_else = Homme("Moi-meme") Homme.mortel #-> True (Tout homme est mortel ) isinstance(someone,Homme) # renvoie true (Aristote est un homme) someone.mortel # -> True (Aristote est mortel)
L'Idée de fleur est une classe
Une fleur en particulier est une instance de la classe Fleur
Bonjour,
Ça ne va pas être facile d'être en même temps exact sur le plan informatique, et imagé et simplifié. Mais bon.
Une classe est un "modèle" pour une catégorie d'objet. Elle regroupe tout ce qui concerne l'objet: ses propriétés et ses méthodes de traitement. Ce regroupement s'appelle "l'encapsulation".
Par exemple, dans un espace de dessin, on peut définir la catégorie "point":
Une fois cette classe créée, on peut définir plusieurs points par "instanciation". Dans cette opération, la méthode __init__ sera exécutée, et les 2 arguments x et y seront stockés:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 class Point(object): def __init__(self, x, y): self.x = x self.y = y def dessine(self): print u"on dessine le point x=%d, y=%d" % (self.x, self.y)
A, B et C sont des instances de la classe Point. Et dans cette classe, les "self" sont les adresses des instances: la même classe permettra donc de définir autant de points qu'on veut, chaque point ayant ses propres attributs self.x et self.y, qu'on pourra d'ailleurs appeler de l'extérieur: A.x, A.y.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 A = Point(20,30) B = Point(50,60) C = Point(70,80)
Et une fois qu'on a défini ces 3 points, on peut leur demander de se dessiner (dessine() est une "méthode" de la classe Point):
Ce qui est intéressant dans ces 3 instructions, c'est que la partie du programme qui demande aux points de se dessiner ne sait pas comment ils vont faire: c'est la classe Point qui sait!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 A.dessine() on dessine le point x=20, y=30 B.dessine() on dessine le point x=50, y=60 C.dessine() on dessine le point x=70, y=80
Maintenant, on veut définir un cercle, et pour ça, il faut 1 point (les coordonnées du centre) et un rayon. Ce n'est pas la peine de repartir de zéro: on va partir de la classe Point, et on va ajouter ce qui manque (le rayon): c'est l'héritage:
On dit que la classe Cercle hérite de Point à 2 endroits: dans class Cercle(Point), et dans Point.__init__(self,x,y). Une fois cela fait, certaines instructions de Point, qui sont encore valables dans Cercle, ne sont pas répétées: par exemple self.x=x et self.y=y. Par contre, self.R=R manquait: on l'ajoute.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 class Cercle(Point): def __init__(self, x, y, R): Point.__init__(self,x,y) self.R = R def dessine(self): print u"on dessine le cercle x=%d, y=%d, R=%d" % (self.x, self.y, self.R) D = Cercle(20,30,10) D.dessine() on dessine le cercle x=20, y=30, R=10 E = Cercle(45,23,42) E.dessine() on dessine le cercle x=45, y=23, R=42
Et, bien sûr, la méthode dessine doit être redéfinie (c'est la "surcharge") parce qu’on ne dessine pas de la même façon un point et un cercle.
On pourrait aussi ajouter de nouvelles méthodes pour, par exemple, calculer la surface du cercle, ce qui n'aurait pas de sens pour un point.
On peut continuer longtemps comme ça à créer tous les objets graphiques qu'on veut. Et quand on veut les dessiner, on leur envoie la même instruction (X.dessine()) et chacun des objets s'affichera en étant le seul à savoir comment il faut faire.
Ouf... Je suis loin d'avoir tout dit, et j'ai conscience d'avoir fait des raccourcis, mais au moins, ces objets à dessiner qui se définissent les uns à partir des autres, c'est assez concret. Pour la suite, voir la doc Python ainsi que, par exemple: http://fr.wikipedia.org/wiki/Classe_%28informatique%29 et http://fr.wikipedia.org/wiki/Objet_%28informatique%29
Bon courage!
Bonsoir,
Hors sujet
Dans la métaphore la plus complète n'est il pas, dans un premiers temps, plus simple de présenter une classe comme l'ADN d'un objet ?
@+
Bonjour,
Si l'explication fournie par VV33D (#2) est imagée, elle reste un peu ... floue au niveau des termes employés.
Mais pour celle fournie par tyrtamos (#3), elle m'a enfin permis de comprendre ce principe des classes que j'évitais d'utiliser tellement cela me paraissait hermétique. J'ai bien lu une quantité de documentation là-dessus (en C, C++, Python), mais les termes techniques employés à tours de bras (instances, méthodes, héritage, ...) ne voient jamais leur sens expliqué simplement comme ici. Et que dire lorsque ces termes sont en anglais
Merci pour ces efforts didactiques.
J'espère que, comme moi, roro34570 (#1) en aura tiré autant de bénéfice.
A+
Salut,
Et si on essayait l'approche "historique"?
Il y a quelques années on écrivait par exemple un driver de joystick, avec ses différents bits hardware lisibles à une adresse précise. Ça marchait déjà bien, c'était le minimum pour écrire un jeu. Attention, ce n'est pas du C, plutôt un pseudo code.
Puis on a ajouté quelques fonctions, histoire d'isoler le bit "va à droite" du bit "va à gauche" ou encore le bit "t'as appuyé sur la gâchette". Ceci afin que le programmeur dit "de haut niveau" n'ait plus qu'un booléen à traiter pour décider si le personnage va aller a droite ou à gauche. C'était merveilleux, on avait réussi à coder ce qu'on voulait, ça marchait super bien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 joystickPort = 0x415; BIT_DROITE = 0x02 if (*joystick & BIT_DROITE == BIT_DROITE) allerADroite();
Et à ce moment là, y'a une andouille qui a demandé "Je peux jouer aussi?".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 joystickPort = 0x415; if (aDroiteActif(*joystickPort )) allerADroite();Et voilà, les classe étaient inventées, elles nous viennent en fait de la multiplication des joysticks. On se disait "il nous faudrait un truc qui nous permette d'écrire ça:".
Il faudrait aussi que les joysticks possèdent leur propres fonctions. Il y a un convention pour dire qu'une fonction ou une variable appartient à une classe, c'est le point. D'ailleurs, une autre convention, c'est de dire qu'une fonction appartenant à une classe s'appelle une méthode... Que l'on pourrait invoquer ainsi:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 joystick1= JOYSTICK(port=0x415); joystick2= JOYSTICK(port=0x416);
En fait une classe, c'est ça: Un "modèle d'objet". Avec ses propriétés (c'est le nom d'une variable appartenant à une classe) et ses méthodes. Ce qui permet d'instancier (créer des objets suivant le modèle) à l'infini. Quasiment tous les langages intègrent ce concept de Programmation orientée objet (POO). Viennent s'y ajouter des concepts comme l'héritage: on peut fabriquer des berlines, des 4x4 ou des coupés à partir d'un objet "véhicule à 4 roues et 1 volant" en héritant de l'objet parent les propriétés et méthodes puis en en personnalisant quelque-unes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 if(joystick1.enAvantActif()) faireAvancerMario(); if(joystick2.enArriereActif()) faireReculerTortue();
On peut programmer sans utiliser la POO, mais on rate quelques chose, il faut passer par des "structures", c'est beaucoup moins lisible, donc beaucoup moins compréhensible. Les exemples fourmillent. Les carnets d'adresses par exemple, où les contacts sont des instances de la classe CONTACT. les drivers, avec leurs méthodes lire et écrire, etc...
A+
Pfeuh
Un grand merci à tous pour ce florilège de réponses toutes complémentaires. Je pense avoir bien saisie le concept. Il me manque plus qu'à le mettre en application (y'a plus qu'à)
Apparement ce post n'était pas inutile et je pense qu'il servira à plus d'un![]()
Partager