Programmation Orientée Objet


Thème 1 - Partie B

C'est quoi un objet ?

Quel est cet objet ?


Comment la décrire ?


Que peut on faire avec ?


La programmation orientée objet (POO), ou programmation par objet, est un paradigme de programmation informatique.

En POO, on décrit les propriétés d'un objet.

Classe & instance

Les classes sont les modèles générique qui permettent de définir les propriétés de chaque objet issue d’une même classe.

Un objet est une instance d’une classe.

Attributs & méthodes

Un objet est composé d’attributs et de méthodes :

  • Les attributs sont les propriétés statiques de l’objet, à la manière des variables. Ce sont de données liées à l’objet

  • Les méthodes définissent les interactions de l’objet. Ce sont des fonctions liées à l’objet

Définir une classe Sorcier


class NomDeLaClasse:
    
    instructions

        

Initialiser une instance



        

mon_instance = MaClasse()
        

class Sorcier:
    pass

sorcier1 = Sorcier()
 
    

Ajouter des attributs


class Sorcier:
    pass

sorcier1 = Sorcier()
sorcier1.nom = "Potter"

    

Ajouter des attributs


class Sorcier:
    pass

sorcier1 = Sorcier()
sorcier1.nom = "Potter"
sorcier1.prenom = "Harry"
    

Ajouter des attributs

Accéder au attribut

On suppose que l'instance sorcier1 a été definie comme ci-dessous.

class Sorcier:
    pass

sorcier1 = Sorcier()
sorcier1.nom = "Potter"
sorcier1.prenom = "Harry"

Accéder au attribut

On suppose que l'instance sorcier1 a été definie comme ci-dessous. Pour afficher le nom du sorcier1, il faudra donc faire.

class Sorcier:
    pass

sorcier1 = Sorcier()
sorcier1.nom = "Potter"
sorcier1.prenom = "Harry"

print(sorcier1.nom)

La méthode
__init__

Initialiser une classe


class Sorcier:
    
    def __init__(self):

 
    

class Sorcier:

    def __init__(self):
        self.prenom = "Harry"

            

 
    

class Sorcier:

    def __init__(self):
        self.prenom = "Harry"
        self.nom = "Potter"


 
    

class Sorcier:

    def __init__(self):
        self.prenom = "Harry"
        self.nom = "Potter"
        self.maison = "Griffondor"


 
    

class Sorcier:

    def __init__(self):
        self.prenom = "Harry"
        self.nom = "Potter"
        self.maison = "Griffondor"
        self.age = 11

class Sorcier:

    def __init__(self):
        self.prenom = "Harry"
        self.nom = "Potter"
        self.maison = "Griffondor"
        self.age = 11
        self.sorts = []
    

class Sorcier:

    def __init__(self):
        self.prenom = "Harry"
        self.nom = "Potter"
        self.maison = "Griffondor"
        self.age = 11
        self.sorts = []
            
sorcier1 = Sorcier()
sorcier2 = Sorcier()
        
 
    

class Sorcier:

    def __init__(self):
        self.prenom = "Harry"
        self.nom = "Potter"
        self.maison = "Griffondor"
        self.age = 11
        self.sorts = []
            
sorcier1 = Sorcier()
sorcier2 = Sorcier()
        
print(sorcier1.prenom)
print(sorcier2.prenom)

    

class Sorcier:

    def __init__(self,prenom, nom, maison, age):
        self.prenom = prenom
        self.nom = nom
        self.maison = maison
        self.age = age
        self.sorts = []
    

class Sorcier:

    def __init__(self,prenom, nom, maison, age):
        self.prenom = prenom
        self.nom = nom
        self.maison = maison
        self.age = age
        self.sorts = []

            
harry = Sorcier("Harry","Potter","Griffondor",11)
    

Créer des méthodes


class Sorcier:
    def __init__(self,prenom, nom, maison, age):
        self.prenom = prenom
        self.nom = nom
        self.maison = maison
        self.age = age
        self.sorts = []
    

class Sorcier:
    def __init__(self,prenom, nom, maison, age):
        self.prenom = prenom
        self.nom = nom
        self.maison = maison
        self.age = age
        self.sorts = []

    def presentation(self):
    

class Sorcier:
    def __init__(self,prenom, nom, maison, age):
        self.prenom = prenom
        self.nom = nom
        self.maison = maison
        self.age = age
        self.sorts = []

    def presentation(self):
        print(f"Bonjour je m'appelle {self.prenom} {self.nom}, je suis de la maison {self.maison}")

    

Encapsulation

L'erreur est humaine, évitons la ...

Encapsulation

L’encapsulation est le regroupement de données et de méthodes dans une classe afin que vous puissiez masquer les informations et restreindre l’accès de l’extérieur.

Dans le TP Sorcier, les sorciers ont des attributs public.

class Sorcier:

    def __init__(self, nom, point_vie, endurance):
            self.nom  = nom
            self.point_vie = point_vie
            self.endurance = endurance
        
Dans le TP Sorcier, les sorciers ont des attributs publics et un privé.

class Sorcier:

    def __init__(self, nom, point_vie, endurance):
            self.nom  = nom
            self.point_vie = point_vie
            self.endurance = endurance
            self.__sorts = []
        
Un attribut public est accessible et onc modifiable

harry = Sorcier("Harry",100,75)
print(harry.nom)
"Harry"
harry.nom = "Hermione"
print(harry.nom)
"Hermione"
        
A l'inverse, un attribut privé n'est pas accessible en dehors de la classe.
    
harry.__sorts = []
AttributeError: 'Sorcier' object has no attribute '__sorts'
    

Attributs privés

On peut vouloir que certains attributs ne soient pas directement accessible.
On peut aussi vouloir vérifier que les valeurs données à certains attributs respect des régles

En Python


Pour protéger un attribut ou une méthode, on le préfixe par _ (1 espace souligné) ou __ (2 espaces soulignés)

Accesseur et mutateur

  • Les accesseurs méthodes permettant d'accéder aux données d'un objet, parfois getter (appellation d'origine anglophone)
  • Les mutateur méthodes permettant d'accéder aux données d'un objet, parfois setter

En python

Assertion

1. a) Quelles sont les assertions à prévoir pour vérifier que l’arôme et la durée correspondent bien à des valeurs acceptables. Il faudra aussi expliciter les commentaires qui seront renvoyés.

Pour rappel :
• L’arôme doit prendre comme valeur 'fraise', 'abricot', 'vanille' ou 'aucun'.
• Sa date de durabilité minimale (DDM) est une valeur positive.
1. b) Pour créer un yaourt, on exécutera la commande suivante :
Mon_Yaourt = Yaourt('fraise',24)

Quelle valeur sera affectée à l’attribut genre associé à Mon_Yaourt ?
1. c) Écrire en python une fonction GetArome(self), renvoyant l’arôme du yaourt créé.
2. On appelle mutateur une méthode permettant de modifier un ou plusieurs attributs d’un objet.

Sur votre copie, écrire en Python le mutateur SetArome(self,arome) permettant de modifier l’arôme du yaourt.

On veillera à garder une cohérence entre l’arôme et le genre.