Introduction à Python : Concepts Clés
Introduction à Python : Concepts Clés
PROGRAMMATION EN PYTHON
Classes de LICENCE
UP Informatique
ESATIC
Ecole Supérieure Africaine des TIC
Table des matières
I. Calculs et variables python............................................................................................................................4
1. Python c'est quoi ?.....................................................................................................................................4
2. Que fait Python ?........................................................................................................................................4
3. Pourquoi préférer Python aux autres langages ?.....................................................................................4
4. Qui utilise Python ?....................................................................................................................................4
II. Calculs et variables python........................................................................................................................5
1. Calculs.........................................................................................................................................................5
2. Les variables...............................................................................................................................................5
3. Echapper les quotes....................................................................................................................................6
4. Nommer une variable.................................................................................................................................7
5. Les types de variables................................................................................................................................7
III. Les fonctions python................................................................................................................................14
1. Créer ma première fonction....................................................................................................................14
2. Les fonctions paramétrées.......................................................................................................................14
3. Un paramètre est obligatoire...................................................................................................................15
4. Portée des variables (variable globale et variable locale)......................................................................15
5. Procédure et fonctions..............................................................................................................................15
IV. IF ELIF ELSE Python Conditions............................................................................................................9
1. Condition if else..........................................................................................................................................9
2. Condition elif............................................................................................................................................10
3. Les comparaisons possibles.....................................................................................................................10
4. Comment fonctionnent les structures conditionnelles ?........................................................................10
5. AND / OR..................................................................................................................................................11
6. Chainer les comparateurs........................................................................................................................11
V. Les boucles for et while Python...................................................................................................................12
1. La boucle while.........................................................................................................................................12
2. La boucle for.............................................................................................................................................12
3. Range.........................................................................................................................................................13
VI. Les listes python.......................................................................................................................................16
1. Créer une liste en python.........................................................................................................................16
2. Ajouter une valeur à une liste python.....................................................................................................16
3. Afficher un item d'une liste.....................................................................................................................16
4. Supprimer une entrée avec un index......................................................................................................17
5. Supprimer une entrée avec sa valeur......................................................................................................17
6. Inverser les valeurs d'une liste................................................................................................................17
7. Compter le nombre d'items d'une liste...................................................................................................17
8. Compter le nombre d'occurrences d'une valeur....................................................................................17
9. Trouver l'index d'une valeur...................................................................................................................17
10. Manipuler une liste...............................................................................................................................18
11. Boucler sur une liste.............................................................................................................................18
12. Copier une liste.....................................................................................................................................18
13. La fonction range.................................................................................................................................19
14. Agrandir une liste par une liste...........................................................................................................19
15. Astuces..................................................................................................................................................19
VII. Les tuples python......................................................................................................................................21
1. Créer un tuple...........................................................................................................................................21
2. Ajouter une valeur à un tuple..................................................................................................................21
3. Afficher une valeur d'un tuple................................................................................................................21
4. A quoi sert un tuple alors ?......................................................................................................................21
VIII. Les dictionnaires python.......................................................................................................................23
1. Comment créer un dictionnaire ?...........................................................................................................23
2. Comment ajouter des valeurs dans un dictionnaire ?...........................................................................23
3. Récupérer une valeur dans un dictionnaire...........................................................................................23
4. Supprimer une entrée de dictionnaire....................................................................................................23
5. Récupérer les valeurs par une boucle.....................................................................................................23
Python est un langage de programmation interprété, c'est à dire qu'il n'est pas nécessaire
de le compiler avant de l'exécuter. Si vous avez déjà touché un peu à la programmation,
vous verrez que ce langage possède une certaine poésie. Les programmeurs s'amusent
souvent à trouver la manière la plus jolie/efficace d'écrire une suite d'instructions. Rares
sont ceux qui critiquent la logique Python -contrairement à javascript par exemple-.
* Web : Aujourd'hui python combiné avec le framework Django est un très bon choix
technologique pour des gros projets de sites internet.
* Système : Python est également souvent utilisé par les "admin système" pour créer des
tâches dites répétitives ou simplement de maintenance. D'ailleurs si vous voulez créer des
applications java en codant en python, c'est possible grâce au projet Jython.
Python est également utilisé dans les milieux scientifiques, par exemple la
bioinformatique. Des librairies sont disponibles pour ce domaine comme le module
biopython .
Il existe également des bibliothèques facilitant la création de jeux vidéo en 2D (et 3D)
exemple: pyGame .
2. Les variables
Une variable est une sorte de boite virtuelle dans laquelle on peut mettre une (ou
plusieurs) donnée(s). L'idée est de stocker temporairement une donnée pour travailler
avec. Pour votre machine une variable est une adresse qui indique l'emplacement de la
mémoire vive où sont stockées les informations que nous avons liées avec.
Affectons une valeur à la variable "age" que nous allons ensuite afficher :
>>> age = 30
>>> age
30
On va ensuite ajouter 10 à la valeur de cette variable :
>>> age = 30
>>> age = age + 10
>>> age
40
Il est possible de mettre une variable dans une autre variable.
>>> age = 30
>>> age2 = age
>>> age2
30
Vous pouvez mettre à peu près tout ce que vous voulez dans votre variable, y compris du
texte :
>>> age = "J'ai 30 ans"
>>> age
"J'ai 30 ans"
Il est possible de concaténer, c'est à dire d'ajouter du texte à du texte :
>>> age = age + " et je suis encore jeune !"
>>> age
"J'ai 30 ans et je suis encore jeune !"
Vous pouvez même multiplier une chaine de caractères :
>>> age = "jeune"
>>> age * 3
'jeunejeunejeune'
Evidemment, si vous essayez de faire des additions avec des variables qui sont des
chiffres et d'autres qui sont du texte, l'interpréteur va vous gronder :
>>> age = "J'ai 30 ans"
>>> age
"J'ai 30 ans"
>>> age + 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
Vous remarquez que l'interpréteur est sympa puisqu'il vous dit ce qui ne va pas : Il ne
peut pas concaténer str et int.
Ces mots réservés servent à faire autre chose que nous verrons quoi plus en détail dans
les prochains chapitres.
Pour nommer une variable vous devez obligatoirement utiliser les lettres de l'alphabet, les
chiffres et le caractère "_" et "-". N'utilisez pas les accents, ni les signe de ponctuation ou
le signe @. De plus les chiffres ne doivent jamais se trouver en première position dans
votre variable :
>>> 1var = 1
File "<stdin>", line 1
1var = 1
^
SyntaxError: invalid syntax
Comme vous le remarquez, python refuse ce genre de syntaxe, mais il acceptera var1 =
1.
1. Condition if else
Il est possible de donner des instructions quel que soit les choix possibles avec le mot clé
else.
>>> a = 20
>>> if a > 5:
... a = a + 1
... else:
... a = a - 1
...
>>> a
21
Changeons uniquement la valeur de la variable a:
>>> a = 3
>>> if a > 5:
... a = a + 1
... else:
... a = a - 1
...
>>> a
2
2. Condition elif
Il est possible d'ajouter autant de conditions précises que l'on souhaite en ajoutant le mot
clé elif, contraction de "else" et "if", qu'on pourrait traduire par "sinon".
>>> a = 5
>>> if a > 5:
... a = a + 1
... elif a == 5:
... a = a + 1000
... else:
... a = a - 1
...
>>> a
1005
Dans cet exemple, on a repris le même que les précédent mais nous avons ajouté la
condition "Si la valeur est égale à 5" que se passe-t-il ? Et bien on ajoute 1000.
1. La boucle while
En anglais "while" signifie "Tant que". Pour créer une boucle, il faut donc utiliser ce mot
clé suivi d'une indication qui dit quand la boucle s'arrête.
Un exemple sera plus parlant :
On désire écrire 100 fois cette phrase :
"Je ne dois pas poser une question sans lever la main"
Ecrire à la main prend beaucoup de temps et beaucoup de temps x 100 c'est vraiment
beaucoup de temps, et peu fiable, même pour les chanceux qui connaissent le copier-
coller. Et un bon programmeur est toujours un peu fainéant perfectionniste, il cherchera
la manière la plus élégante de ne pas répéter du code.
>>> i = 0
>>> while i < 10:
... print("Je ne dois pas poser une question sans lever la main")
... i = i +1
2. La boucle for
La boucle for permet de faire des itérations sur un élément, comme une chaine de
caractères par exemple ou une liste.
Exemple :
>>> v = "Bonjour toi"
>>> for lettre in v:
... print (lettre)
...
B
o
n
j
o
u
r
t
o
i
3. Range
Il est possible de créer une boucle facilement avec range :
for i in range(0,100):
print (i)
Si vous avez compris les principes des fonctions, vous avez compris 80% de ce qu'est la
programmation.
3. Un paramètre est obligatoire
Lorsque vous indiquez des paramètres à une fonction, ces derniers doivent
impérativement être renseignés sans quoi une erreur apparaitra.
>>> def augmente_moi(a, b):
... return 30 + a + b
...
>>> augmente_moi(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: augmente_moi() takes exactly 2 arguments (1 given)
5. Procédure et fonctions
Pour votre culture informatique sachez qu'une fonction n'est pas obligée de renvoyer une
valeur, on parlera alors dans ce cas plutôt de procédure.
VI. Les listes python
Les listes (ou list / array) en python sont une variable dans laquelle on peut mettre
plusieurs variables.
1. Créer une liste en python
Pour créer une liste, rien de plus simple :
>>> liste = []
Vous pouvez voir le contenu de la liste en l'appelant comme ceci :
>>> liste
<type 'list'>
2. Ajouter une valeur à une liste python
Vous pouvez ajouter les valeurs que vous voulez lors de la création de la liste python:
>>> liste = [1,2,3]
>>> liste
[1, 2, 3]
Ou les ajouter après la création de la liste avec la méthode append (qui signifie "ajouter"
en anglais):
>>> liste = []
>>> liste
[]
>>> [Link](1)
>>> liste
[1]
>>> [Link]("ok")
>>> liste
[1, 'ok']
On voit qu'il est possible de mélanger dans une même liste des variables de type
différent. On peut d'ailleurs mettre une liste dans une liste.
>>> x = [[1,2], 2]
>>> y = [Link](x)
>>> x
[[1, 2], 2]
>>> y
1. Créer un tuple
Pour créer un tuple, vous pouvez utiliser la syntaxe suivante :
>>> mon_tuple = ()
PROG
RAMM
ATION
ORIEN
TEE
OBJET
I. Introduction à la Programmation Orientée Objet
1. Qu’est-ce que la Programmation Orientée Objet (POO)
La POO est un paradigme de programmation informatique élaboré par Alan Kay, dans les années 70, qui
consiste à la définition de briques logicielles (objets) et à leurs interactions entre elles. Autrement dit,
c’est un ensemble d’objets qui communiquent entre eux par échange de messages.
2. Vers la Programmation Orientée Objet
Depuis plusieurs années, le coût des dépenses informatiques ne dépend plus du matériel mais du
développement d’application qui est de plus en plus performant et complexe. Par conséquent le coût
devient de plus en plus élevé.
Nous avons vu plusieurs types de base en Python (int pour les entiers, float pour les flottants, str pour
les chaînes de caractères, etc.). La notion de classe va en quelque sorte nous permettre de généraliser la
notion de « type » afin de créer de nouvelles structures de données.
Une classe définit des attributs et des méthodes. Par exemple, imaginons une classe Voiture qui
servira à créer des objets qui sont des voitures. Cette classe va pouvoir définir un attribut couleur, un
attribut vitesse, etc. Ces attributs correspondent à des propriétés qui peuvent exister pour une voiture. La
classe Voiture pourra également définir une méthode rouler(). Une méthode correspond en quelque
sorte à une action, ici l’action de rouler peut-être réalisée pour une voiture. Si on imagine une classe
Avion, elle pourra définir une méthode voler(). Elle pourra aussi définir une méthode rouler(). Par
contre, la classe Voiture n’aura pas de méthode voler() car une voiture ne peut pas voler. De même, la
classe Avion pourra avoir un attribut altitude mais ce ne sera pas le cas pour la classe Voiture.
Remarque : On ne sait pas dans quel ordre les opérations seront appelées. Mais il faut commencer par
initialiser l’objet : c’est le rôle du constructeur (initialiser).
Héritage : permettre la création d’une classe (dérivée) à partir d’une classe existante (sper-classe)
la classe dérivée (fille) contient sous certaines conditions les attributs et les méthodes de la classe
mère (super-classe) ;
permet ainsi la réutilisation de code ;
plusieurs types d’héritage : public, protégé, ou privé ;
Polymorphisme : permettre de redéfinir dans une classe dérivée les méthodes dont elle hérite de sa
classe mère. On dit que la même méthode possède alors plusieurs formes.
II. Programmation de la classe et de l’objet
1. Principe et syntaxe de définition d’une classe
Une classe définit :
un Unité d’encapsulation : elle regroupe la déclaration des attributs et la définition des
méthodes associées dans une même construction syntaxique.
class NomDeLaClasse:
# Définition de ses caractéristiques
attributs = stockage d’information (état de l’objet).
méthodes = unités de calcul (sous-programmes : fonctions ou procédures).
C’est aussi un espace de noms :
deux classes différentes peuvent avoir des membres de même nom
un TYPE qui permet de :
créer des objets (la classe est un moule, une matrice) ;
Les méthodes et attributs définis sur la classe comme « unité d’encapsulation » pourront être appliqués à
ses objets.
2. Définition d’une classe exemple : « Point »
Voici comment définir une classe appelée ici Point.
class Point:
"Définition d'un point géométrique"
Par convention en Python, le nom identifiant une classe (qu’on appelle aussi son identifiant) débute par
une majuscule. Ici Point débute par un P majuscule.
3. Création d’un objet de type « Point »
Point()
Ceci crée un objet de type Point. En POO, on dit que l’on crée une instance de la classe Point.
Une phrase emblématique de la POO consiste à dire qu’un objet est une instance de classe.
Il faut bien noter que pour créer une instance, on utilise le nom de la classe suivi de parenthèses. Nous
verrons par la suite qu’il peut y avoir des arguments entre ces parenthèses.
4. Affectation à une variable de la référence à un objet
Nous venons de définir une classe Point. Nous pouvons dès à présent nous en servir pour créer des
objets de ce type, par instanciation. Créons par exemple un nouvel objet et mettons la référence à cet
objet dans la variable p :
>>> p = Point()
Avertissement
Comme pour les fonctions, lors de l’appel à une classe dans une instruction pour créer un objet, il faut
toujours indiquer des parenthèses (même si aucun argument n’est transmis). Nous verrons un peu plus
loin que ces appels peuvent se faire avec des arguments (voir la notion de constructeur).
Remarquez bien cependant que la définition d’une classe ne nécessite pas de parenthèses (contrairement
à ce qui de règle lors de la définition des fonctions), sauf si nous souhaitons que la classe en cours de
définition dérive d’une autre classe préexistante (ceci sera expliqué plus loin).
Nous pouvons dès à présent effectuer quelques manipulations élémentaires avec notre nouvel objet dont
la référence est dans p.
Exemple :
>>> print(p)
<__main__.Point instance at 0x012CAF30>
Le message renvoyé par Python indique que p contient une référence à une instance de la classe Point,
qui est définie elle-même au niveau principal du programme. Elle est située dans un emplacement bien
déterminé de la mémoire vive, dont l’adresse apparaît ici en notation hexadécimale.
>>> print(p.__doc__)
Définition d'un point géométrique
On peut noter que les chaînes de documentation de divers objets Python sont associées à l’attribut
prédéfini _ _doc_ _:
On fait bien ici la distinction entre classe et objet. Ici nous avons une seule classe Point, et deux objets
de type Point.
p = Point()
p.x = 1
p.y = 2
print("p : x =", p.x, "y =", p.y)
La syntaxe pour accéder à un attribut est la suivante : on va utiliser la variable qui contient la référence à
l’objet et on va mettre un point «.» puis le nom de l’attribut.
Exemple :
class Point:
"Définition d'un point géométrique"
a = Point()
a.x = 1
a.y = 2
b = Point()
b.x = 3
b.y = 4
print("a : x =", a.x, "y =", a.y)
print("b : x =", b.x, "y =", b.y)
class Point:
"Définition d'un point géométrique"
a = Point()
a.x = 1
a.y = 2
b=a
print("a : x =", a.x, "y =", a.y)
print("b : x =", b.x, "y =", b.y)
a.x = 3
a.y = 4
print("a : x =", a.x, "y =", a.y)
print("b : x =", b.x, "y =", b.y)
[Link](3, 5)
Avertissement
Lors de l’appel de la méthode, le paramètre self n’est pas utilisé et la valeur qu’il prend est la référence à
l’objet. Il y a donc toujours un paramètre de moins que lors de la définition de la méthode.
Exemple:
class Point:
def deplace(self, dx, dy):
self.x = self.x + dx
self.y = self.y + dy
a = Point()
a.x = 1
a.y = 2
print("a : x =", a.x, "y =", a.y)
[Link](3, 5)
print("a : x =", a.x, "y =", a.y)
Un constructeur n’est rien d’autre qu’une méthode, sans valeur de retour, qui porte un nom imposé par
le langage Python : _ _init_ _(). Ce nom est constitué de init entouré avant et après par _ _ (deux fois le
symbole underscore _, qui est le tiret sur la touche 8). Cette méthode sera appelée lors de la création de
l’objet. Le constructeur peut disposer d’un nombre quelconque de paramètres, éventuellement aucun.
class Point:
def __init__(self):
self.x = 0
self.y = 0
a = Point()
print("a : x =", a.x, "y =", a.y)
a.x = 1
a.y = 2
print("a : x =", a.x, "y =", a.y)
Dans cet exemple, nous avons pu définir des valeurs par défaut pour les attributs grâce au constructeur.
a = Point(1, 2)
print("a : x =", a.x, "y =", a.y)
Exemple complet
class Point:
def _ _init_ _(self, x, y):
self.x = x
self.y = y
a = Point(1, 2)
b = Point(3, 4)
print("a : x =", a.x, "y =", a.y)
print("b : x =", b.x, "y =", b.y)
[Link](3, 5)
[Link](-1, -2)
print("a : x =", a.x, "y =", a.y)
print("b : x =", b.x, "y =", b.y)
Exercice1 :
Modifier le programme de façon à ajouter deux autres objets de type Point. Ils seront référencés par des
variables c et d.
Exercice2 :
Définir une classe Point3D qui sera analogue à la classe Point mais pour des points dans l’espace à 3
dimensions. Créer deux objets de type Point3D qui seront référencés par les variables a3D et b3D.
Initialiser ces points et afficher leurs coordonnées x, y, z.
III. La notion d’encapsulation
Le concept d’encapsulation est un concept très utile de la POO. Il permet en particulier d’éviter une
modification par erreur des données d’un objet. En effet, il n’est alors pas possible d’agir directement
sur les données d’un objet ; il est nécessaire de passer par ses méthodes qui jouent le rôle d’interface
obligatoire.
Protection d'attributs :
En Python tous les attributs sont des attributs publics donc accessibles à partir d'autres classes.
L'encapsulation n'est donc pas respectée.
Mais il est possible de brouiller l'accès à un attribut en le nommant comme suit : __nomAttribut
Un attribut brouillé est renommé automatiquement à _NomClasse _NomAttribut
class Point:
def _ _init_ _(self, x, y):
self._ _x = x
self._ _y = y
Il n’est alors plus possible de faire appel aux attributs _ _x et _ _y depuis l’extérieur de la classe Point.
>>> p = Point(1, 2)
>>> p.__x
Il faut donc disposer de méthodes qui vont permettre par exemple de modifier ou d’afficher les
informations associées à ces variables.
class Point:
def __init__(self, x, y):
self.__x = x
self.__y = y
def affiche(self):
print("abscisse =", self.__x, "ordonnee =", self.__y)
a = Point(2, 4)
[Link]()
[Link](1, 3)
[Link]()
2. Accesseurs et mutateurs
Parmi les différentes méthodes que comporte une classe, on a souvent tendance à distinguer :
les constructeurs ;
les accesseurs (en anglais accessor) qui fournissent des informations relatives à l’état d’un objet,
c’est-à-dire aux valeurs de certains de ses attributs (généralement privés) sans les modifier ;
les mutateurs (en anglais mutator) qui modifient l’état d’un objet, donc les valeurs de certains
de ses attributs.
On rencontre souvent l’utilisation de noms de la forme get_XXXX() pour les accesseurs et set_XXXX()
pour les mutateurs, y compris dans des programmes dans lesquels les noms de variable sont francisés.
Par exemple, pour la classe Point sur laquelle nous avons déjà travaillé on peut définir les méthodes
suivantes :
Exemple :
class Point:
def __init__(self, x, y):
self.__x = x
self.__y = y
def get_x(self):
return self.__x
def get_y(self):
return self.__y
a = Point(3, 7)
print("a : abscisse =", a.get_x())
print("a : ordonnee =", a.get_y())
a.set_x(6)
a.set_y(10)
print("a : abscisse =", a.get_x())
print("a : ordonnee =", a.get_y())
Notez qu’il n’est pas toujours prudent de prévoir une méthode d’accès pour chacun des attributs privés
d’un objet. En effet, il ne faut pas oublier qu’il doit toujours être possible de modifier l’implémentation
d’une classe de manière transparente pour son utilisateur.
IV. Attributs et méthodes de classe
1. Attributs de classe
Un attribut de classe est un attribut au niveau de la classe dont la valeur est partagée par tous les objets
instanciés à partir de la classe.
L’accès à l’attribut de la classe est données par: [Link]
Exemple :
class A:
Résultats obtenus :
nb = 0
A : nb = 0
def __init__(self, x): Partie 1 :
print("Création objet de type A") Création objet de type A
self.x = x A : nb = 1
[Link] = [Link] + 1 a : x = 3 nb = 1
Partie 2 :
print("A : nb = ", [Link]) Création objet de type A
A : nb = 2
print("Partie 1 :")
a : x = 3 nb = 2
a = A(3) b : x = 6 nb = 2
print("A : nb = ", [Link]) Création objet de type A
print("a : x = ", a.x, " nb = ", [Link]) Partie 3 :
print("Partie 2 :") A : nb = 3
b = A(6) a : x = 3 nb = 3
print("A : nb = ", [Link]) b : x = 6 nb = 3
c : x = 8 nb = 3
print("a : x = ", a.x, " nb = ", [Link])
print("b : x = ", b.x, " nb = ", [Link])
c = A(8)
print("Partie 3 :")
print("A : nb = ", [Link])
print("a : x = ", a.x, " nb = ", [Link])
print("b : x = ", b.x, " nb = ", [Link])
print("c : x = ", c.x, " nb = ", [Link])
2. Méthodes de classe
Une méthode d’instance est un sous-programme qui exploite l’état d’un objet (en accès et/ou en
modification). Le premier paramètre désigne nécessairement l’objet. Par convention, on l’appelle
self.
Une méthode de classe est une méthode qui travaille sur la classe (et non l’objet).
o Elle peut s’exécuter sans instancier la classe (pas de création d’objet)
o Elle est décorée @classmethod.
o Son premier paramètre est nommé cls par convention (et non self).
@classmethod
def changer_langue(cls, langue):
if [Link] == ’fr’:
cls._directions = (’Nord’, ’Est’, ’Sud’, ’Ouest’)
else:
cls._directions = (’North’, ’East’, ’South’, ’West’)
Robot.changer_langue(’en’) # Utilisation
Une méthode statique est une méthode définie dans l’espace de nom de la classe mais est indépendante
de cette classe. Elle est décorée @staticmethod.
class Date:
...
@staticmethod
def est_bissextile(annee):
return annee % 4 == 0 and (annee % 100 != 0 or annee % 400 == 0)
Exemple :
class A:
nb = 0
def __init__(self):
print("creation objet de type A")
[Link] = [Link] + 1
print("il y en a maintenant ", [Link])
@classmethod
def get_nb(cls):
return [Link]
Pour créer une méthode de classe, il faut la faire précéder d’un « décorateur » : @classmethod
if __name__ == "__main__":
d1 = Date(25, 4, 2013)
assert [Link] == 4
# d1.__mois # AttributeError: ’Date’ object has no attribute ’__mois’
assert d1._Date__mois == 4 # à ne pas utiliser !
[Link] = 12
assert [Link] == 12
[Link] = 13 # ValueError
class A:
ac = 10 # Attribut de classe
def __init__(self, v):
[Link] = v # ai attribut d’instance
a = A(5) #------------------------------
assert [Link] == 5
assert [Link] == 10
assert [Link] == 10 # on a accès à un attribut de classe depuis un objet
# [Link] # AttributeError: type object ’A’ has no attribute ’ai’
b = A(7) #------------------------------
assert [Link] == 7
assert [Link] == 10
[Link] = 11 #------------------------------
assert [Link] == 11 # normal !
assert [Link] == 5 # ai est bien un attribut d’instance
[Link] = 20 #------------------------------
assert [Link] == 20 # logique !
assert [Link] == 20 # l’attribut de classe est bien partagé par les instances
[Link] = 30 #-------------- Est-ce qu’on modifie l’attribut de classe ac ?
assert [Link] == 30 # peut-être
assert [Link] == 20 # mais non ! [Link] = 30 définit un nouvel attribut d’instance
import math
class Point:
def __init__(self, x=0, y=0):
self.x = float(x)
self.y = float(y)
def __str__(self):
return "(%s ; %s)" % (self.x, self.y)
1. Relation d’utilisation
Principe : Une classe utilise une autre classe (en général, ses méthodes).
Segment Point
Extrémité1
x
* Extrémité2 y
longueur ()
translater (dx,dy) distance (autre)
afficher () *
translater (dx,dy)
afficher ()
Exemple : La classe Segment utilise la classe Point. Un segment est caractérisé par ses deux points
extrémités :
le translater, c’est translater les deux points extrémités
sa longueur est la distance entre ses extrémités
l’afficher, c’est afficher les deux points extrémités
Remarque : UML définit plusieurs niveaux de relation d’utilisation (dépendance, association,
agrégation et composition) qui caractérisent le couplage entre les classes (de faible à fort).
Programmation de la classe Segment
class Segment:
def __init__(self, e1, e2):
self.extremite1 = e1
self.extremite2 = e2
def __str__(self):
return "[%s - %s]" % (self.extremite1, self.extremite2)
def longueur(self):
return [Link](self.extremite2)
Programmation du schéma donné en exemple
def exemple():
# créer les points sommets du triangle
p1 = Point(3, 2)
p2 = Point(6, 9)
p3 = Point(11, 4)
# créer les trois segments
s12 = Segment(p1, p2)
s23 = Segment(p2, p3) Le résultat obtenu :
s31 = Segment(p3, p1)
[(3.0 ; 2.0) - (6.0 ; 9.0)]
# créer le barycentre [(6.0 ; 9.0) - (11.0 ; 4.0)]
sx = (p1.x + p2.x + p3.x) / 3.0 [(11.0 ; 4.0) - (3.0 ; 2.0)]
sy = (p1.y + p2.y + p3.y) / 3.0 (6.666666666666667 ; 5.0)
barycentre = Point(sx, sy)
# construire le schéma
schema = [s12, s23, s31, barycentre];
# afficher le schéma
for elt in schema:
print(elt)
2. Héritage
Héritage simple
Le principe consiste à définir une nouvelle classe par spécialisation d’une (ou plusieurs) classes
existantes. C’est le mécanisme qui permet de se servir d’une classe préexistante pour en créer une
nouvelle qui possèdera des fonctionnalités supplémentaires ou différentes.
Exemple : Définir une classe PointNommé sachant que la classe Point existe.
La classe PointNommé :
hérite (récupère) tous les éléments de la classe Point
ajoute un nom et les opérations pour manipuler le nom
redéfinit la méthode « afficher » (pour afficher le nom et les coordonnées du point)
Point est la super-classe, PointNommé la sous-classe
Redéfinition (surcharge):
Donner une nouvelle implantation à une méthode déjà présente dans une super-classe (override, en
anglais). Certains auteurs parlent de surcharge (overload).
Dans l’exemple suivant, nous surchargeons l’opérateur d’addition pour le type Vecteur2D. Nous
surchargeons également la méthode spéciale __str__ utilisée pour l’affichage par print ().
Polymorphisme :
Plusieurs formes pour la même méthode. Plusieurs versions de la méthode afficher dans PointNommé,
la sienne et celle de Point. C’est la faculté pour deux méthodes (ou plus) portant le même nom, mais
appartenant à des classes héritées distinctes un travail différent. Cette propriété est acquise par la
technique de la surcharge.
Notation et vocabulaire :
Notation UML : Point
x
Point Classe parente
y
Classe de base
Super classe distance(autre)
translater(dx,dy)
afficher()
Relation d’héritage (Python)
Spécialisation/génération (UML)
PointNommé PointNomme
Classe fille
Classe dérivée nom
Sous-classe
nommer(nouveau)
afficher()
Notation en Python :
Class PointNommé(Point) : #PointNommé hérite de Point
La classe PointNommé
class PointNomme(Point): # La classe PointNommé hérite de Point
def _ _init_ _(self, nom, x=0, y=0):
Point._ _init_ _(self, x, y) # initialiser la partie Point du PointNommé
[Link] = nom # un nouvel attribut
# afficher le schéma
for elt in schema:
print(elt)Quand la classe de base fait quelque chose d’utile, on parle d’héritage.
Class compte(object) :
Compte Def afficheSolde(self) :
Print "%+10.2f" % ([Link]/100.0)
+afficherSolde (autre) #...
Class compteSurLivret(compte) :
#...
If __name __ == ‘__main __’ :
compteCourant Compte = compteSurLivret (10 000)
[Link](10 000)
[Link]()
Héritage multiple
Python permet l’héritage multiple.
Il suffit de lister toutes les super classes séparées par des virgules
3. Agrégation :
Chaque client possède un compte.
4. Association :
Une association représente un lien unissant les instances de classe. Elle repose sur la relation « a-un » ou
« utilise-un ».
L'implémentation Python utilisée est généralement l'intégration d'autres objets dans le constructeur de la
classe conteneur :
class Point :
def __init__(self, x, y) :
[Link], [Link] = x, y
class Segment :
"""Classe conteneur utilisant la classe Point."""
def __init__(self, x1, y1, x2, y2) :
[Link] = Point(x1, y1)
[Link] = Point(x2, y2)
def __str__(self) :
return ("Segment : [({ :g}, { :g}), ({ :g}, { :g})]"
.format([Link], [Link], [Link], [Link]))
s = Segment(1.0, 2.0, 3.0, 4.0)
print(s) # Segment : [(1, 2), (3, 4)]
Héritage et polymorphisme
#####
class Atome:
"""atomes simplifiés, choisis parmi les 10 premiers éléments du TP"""
table =[None, ('hydrogène',0), ('hélium',2), ('lithium',4),
('béryllium',5), ('bore',6), ('carbone',6), ('azote',7),
('oxygène',8), ('fluor',10), ('néon',10)]
def affiche(self):
print
print ("Nom de l'élément :", [Link][[Link]][0])
print ("%s protons, %s électrons, %s neutrons" % \
([Link], [Link], [Link]))
class Ion(Atome):
"""les ions sont des atomes qui ont gagné ou perdu des électrons"""
def affiche(self):
"cette méthode remplace celle héritée de la classe parente"
[Link](self) # ... tout en l'utilisant elle-même !
print ("Particule électrisée. Charge =", [Link])
a1 = Atome(5)
a2 = Ion(3, 1)
a3 = Ion(8, -2)
[Link]()
[Link]()
[Link]()
Comment peut-on, à l'intérieur de la définition d'une classe, faire appel à une méthode définie dans
une autre classe ?
Lorsque dans la définition d'une classe, on souhaite faire appel à une méthode définie dans une
autre classe, on doit lui transmettre la référence de l'instance comme premier argument.
[Link](self)
(dans cette instruction, self est bien entendu la référence de l'instance courante).
De la même manière (vous en verrez de nombreux autres exemples plus loin), la méthode constructeur de la
classe Ion() fait appel à la méthode constructeur de sa classe parente, dans :
Atome.__init__(self, nat)