Python3 5 OO v1.4
Python3 5 OO v1.4
Python3 5 OO v1.4
" S’il n’y a pas de solution, c’est qu’il n’y a pas de problème."
– Logique Shadock
| | 2/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
| | 3/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
· De plus en plus utilisé : Méthode Agile qui enchaîne des cycles courts
conception programmation test
| | 4/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
· Inconvénients :
B Modification donnée ⇒ impacts multiples
(toutes les fonctions utilisant la donnée)
B Évolutivité et maintenabilité parfois problématique
Donne de "bons résultats" pour des problèmes aux fonctions bien identifiées, stables
dans le temps (cahier des charges fixé, ne bouge pas).
| | 5/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
| | 6/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
· L’approche "Orienté Objet" est applicable pour l’Analyse, la Conception des sys-
tèmes et la Programmation !
| | 7/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
· Les langages OO (C++, C#, Java, VB.NET, Objective C, Ruby, Ada, PHP, Smaltalk,
Python, Eiffel...) supportent tout ou partie de ces paradigmes...
| | 8/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
| | 9/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
Le principe d’encapsulation
permet aux objets de se présenter sous deux vues possibles :
· la vue externe (celle de l’utilisateur de l’objet) : comment on utilise l’objet
B Définit l’interface de l’objet
B Fournit les services accessibles aux utilisateurs de l’objet
B Ne fournit aucun accès aux mécanismes internes de l’objet
B UML : déclarations qualifiées de publiques (public).
| | 10/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
Le principe d’encapsulation
La métaphore de l’iceberg...
| | 11/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
Le concept de classe
· modèle repésentant une famille d’objets :
B même structure de données
(c.a.d. même liste d’attributs)
B mêmes méthodes
B mêmes relations.
La classe par elle-même ne contient pas les valeurs des données : c’est un
modèle qui décrit la structure des données.
| | 12/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
· Chaque objet (instance d’une classe) donne des valeurs aux attributs de la classe.
| | 13/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
-nom : string
- attribut ou méthode privé (private) -fortune : double
# attribut ou méthode protégé (protected) +Avare(nom : string)
+nom() : string
+ attribut ou méthode publique (public). +encaisser(montant : double) : void
+compter() : double
+depenser(montant : double) : void
| | 14/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
| | 15/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
Le concept de classe
Exemple de déclaration de la classe Avare en langage C++ :
class Avare
{
public:
// tout ce qui est public est accessible à tout le monde.
Avare(const string & nom); // Le constructeur : même nom que la classe
const string & nom();
void encaisser(double montant);
void depenser(double montant);
double compter() const;
protected:
// tout ce qui est protégé est transmis aux classes dérivées
private:
// tout ce qui est privé est interne à la classe
double fortune;
string nom;
}
| | 16/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
Le concept de classe
Exemple de définition de la classe Avare en langage Python :
[Avare.py]
class Avare:
| | 17/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
· Les relations entre classes modélisent les relations (les liens) entre objets.
| | 18/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
· Tout ce que la classe de base sait faire, la classe dérivée sait le faire "mieux" ou
"différement".
· La classe de base (classe mère, parente) transmet toutes ses propriétés trans-
missibles (publiques ou protégées) aux classes dérivées (classe fille, enfant).
| | 19/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
· Souvent arborescent : une classe dérivée peut à son tour être une classe de base
pour une autre dérivation (hiérarchie de classes).
· La classe dérivée :
B ne peut pas accéder aux membres privés de la classe de base
B possède ses propres attributs/méthodes, que la classe de base ne connaît pas
B peut redéfinir (améliorer, spécialiser....) les méthodes héritées de la classe de
base.
L’Héritage est LE mécanisme fondamental pour faire évoluer un modèle, un
programme.
| | 20/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
| | 21/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
| | 22/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
Les attributs d’une classe peuvent être vus comme des composants, au sens de la
relation de composition :
| | 23/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
| | 24/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
| | 25/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
· Cadre méthodologique.
| | 26/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
Le language UML
· UML permet de réaliser des diagrammes (UML2 définit 9 diagrammes)
def __init__(self): # La méthode spéciale '__init__' joue le rôle du constructeur
self.x = 0 # les attributs (publics) sont préfixés par self
self.y = 0
p1 = Point() # p1 : objet de type Point
print("1:",p1)
p1.x = 1; p1.y = 2; # attributs publics accessibles en lecture/écriture !
print("2:",p1.x, p1.y)
p1.x = "n'importe quoi" # danger ....
p1.z = 'ohoh'; # on peut même créer de nouveaux attributs (publics) !!!!
print("3:",p1.x, p1.y, p1.z)
print(dir(p1)) # voir tout ce qu'il y a dans l'objet p1
print(p1.__dict__) # voir le dictionnaire des attributs de p1
| | 28/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
| | 29/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
class Point: # le mot clef 'class' introduit la définition d'une classe
def __init__(self): # La méthode spéciale '__init__' joue le rôle du constructeur
self.x = 0 # les attributs sont préfixés par self
self.y = 0
def info(self): # self est l'objet courant, obligatoire pour une méthode !
print("x :", self.x, "y :", self.y)
p1 = Point() # p1 : objet de type Point
p1.info() # objet.méthode() : exécute 'méthode' avec les données de 'objet'.
print(dir(p1)) # voir tout ce qu'il y a dans l'objet p1
print(p1.__dict__) # les méthodes n'apparaissent pas dans le __dict__ de l'objet
print(Point.__dict__.keys()) # mais dans le __dict__ de la classe
x : 0 y : 0
[’__class__’..., ’__weakref__’, ’info’, ’x’, ’y’]
{’y’: 0, ’x’: 0}
dict_keys([’info’, ’__init__’, ’__weakref__’, ’__dict__’, ’__doc__’, ’__module__’])
| | 30/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
| | 31/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
>>> help(A)
Help on class A in module __main__:
class A(builtins.object)
| Exemple de ’Docstring’ de la classe A, qui
| peut s’étendre sur plusieurs lignes
|
| Methods defined here:
|
| __init__(self)
| le constructeur ne prend pas d’argument
|
| changer_z(self, valeur)
| change sous contrôle la valeur de l’attribut privé z
|
| obtenir_z(self)
| permet de lire la valeur de l’attribut privé z
|
| ----------------------------------------------------------------------
| Data descriptors defined here:
|
| __dict__
| dictionary for instance variables (if defined)
| ...
| | 32/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
· __◦__ est redéfinie dans les classes qui doivent supporter l’opérateur •.
p1 == p2 : False
p1 == p3 : True
| | 33/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
distance: 1.4142135623730951
| | 34/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
xvalue: 1
xvalue: 3
| | 35/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
| | 36/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
| | 37/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
Héritage multiple
class A():
pass
class B():
pass
class D1(A,B): # A et B sont 2 classes indépendantes, l'ordre indiffère
pass
class D2(B,A): # A et B sont 2 classes indépendantes, l'ordre indiffère
pass
class A():
pass
class B(A): # B dérive de A
pass
##class D1(A,B): - > TypeError: Cannot create a consistent method resolution
## pass
| | 39/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
| | 40/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
Méthodes statiques
class Point:
__liste = [] # définition de l'attribut de classe (statique) public 'liste'
def __init__(self, x=0, y=0):
self.__x = x # attribut privé
self.__y = y # attribut privé
Point.__liste.append(self) # utilisation d'un attribut statiques : préfixer
# son nom par le nom de la classe.
def __str__(self): # redéfinition (surcharge) de la fonction str()
return "x: {0:f}, y: {1:f}".format(self.__x, self.__y)
@staticmethod # le décorateur @staticmethod permet de définir
def nbPoint(): # les méthodes statiques => Pas d'argument self !
return len(Point.__liste)
Point(1,1) # création de 2 objets Point sans nom
Point(2,2)
p1=Point(3,3) # création d'un objet Point nommé p1
# print(len(Point.__liste)) -> ERREUR : attribut statique 'nbPt' est privé !
print(Point.nbPoint()) # appel de la méthode statique
| | 41/ 42
Approche OO Objet Classe Relations UML Python OO v1.4
Références bibliographiques
https://docs.python.org/index.html
https://oopenclassrooms.com/courses/apprenez-a-programmer-en-python
| | 42/ 42
B [email protected]
B [email protected]