Le MON-2 de Léonard

Tags :
  • MON
  • 2022-2023
  • temps 1
Auteurs :
  • Léonard Barbotteau

Python programmation orientée objet

Description

Dans ce MON, je vais m'intéresser aux objets dans Python. Ayant déjà une certaine aisance avec Python et aimant bien ce langage, je vais pouvoir développer mes connaissances.

Développement de mes connaissances en Python

Il est intéressant ans la vie de s'ouvrir à de nouvelles connaissances. Mais il est tout aussi important de les approfondir là où on les aime. Ce cours va m'y aider pour Python. Une fois n'est pas coutume, je vais réaliser ce cours à l'aide d'openclassroom

Connaissances de base

Présentation de la classe

Une classe contient d'une part un état (les variables/ données qu'elle contient) et d'autre part un comportement qui correspond à ce que la classe peut faire. Ce comportement est inclu dans les méthodes qui sont comme des fonctions associées à une classe spécifique.

Des objets sont donc créés en correspondance avec une classe. Le type d'un objet associé à une classe est la classe elle même.

Syntaxe d'une classe

Voici l'exemple de l'écriture d'une classe:

class Epargne:
    capitalinitial = 1500
    interets = 0.05

    def calculate_income_first_month(self):
        return self.capitalinitial * self.interets

On peut voir au début deux variables qui lui sont associées, avec des données. Ensuite il y a une méthode qui est également associée à la classe.

Construire une classe dynamique avec le constructeur __ init __

class Epargne:
    def __init__(self, capitalinitial, interets):
        self.capitalinitial = capitalinitial
        self.interets = interets

Ici on voit que les variables de la classe sont dynamiques, et on peut associer un objet à la classe épargne en remplaçant les attributs capitalinitial et interets par ce que l'on veut.

Dans l'exemple suivant:

class Epargne:
    def __init__(self, capitalinitial, interets=0.05):
        self.capitalinitial = capitalinitial
        self.interets = interets

Les intérêts sont de base à 0.05, on peut choisir en créant un objet de changer la valeur de cet attribut ou de la garder si on ne met rien.

Créer ds objets grâce aux classes

Pour le premier exemple d'epargne, si on veut créer un objet on fait comme ceci:

    epargnetest = Epargne(10000, 0.02):

On peut bien évidemment le modifier par la suite:

    epargnetest.capitalinitial = 5000

Maintenant, regardons le premier exemple. On peut assigner le résultat de la méthode à une variable:

income_first_month = epargne.calculate_income_first_month:

Différents types d'attributs

Les attributs d'instance

Il sont définis à l'aide de self. Pour y accéder on doit faire une instanciation:

class Epargne:

    def __init__(self):
        self.interets = 0.05

    def argent(self):
        print("J'aime l'argent")

On doit donc faire une instanciation:

epargnetest = Epargne()

epargnetest.interets

epargnetest.argent()

Les attributs de classe

Il sont définis dans le corps de la classe, et on utilise @classmethod avec un premier paramètre cls

class Epargne:

    banque = ("bnp", "creditagricole")

    @classmethod
    def argent(cls, monnaie):
        return("J'aime l'argent et surtout les", monnaie)

On peut récupérer les variables de classe sans instanciation

Epargne.banque
print(Epargne.argent(euros))

Les attributs statiques

Ils n'ont quasiment pas de lien avec la classe, il faut éviter de les utiliser.

Différentes fonctions utiles

Les propriétés

Les setters et getters permettent de récuperer ou changer la valeur d'un attribut en gardant une cohérence pour le programmeur, donner l'information.

class Epargne:

    def __init__(self):
        self.interets = 0.05

    def _get_interets(self):
        print "Récupération des interets"
        return self.interets

    def _set_interets(self, change):
        print "Les interets ont changé"
        self.interets  =  change

    interets=property(_get_interets, _set_interets)

Si interets change, on aura un message. Ce n'est pas obligatoire mais ça apporte de la clarté.

La fonction dir, l'attribut __ dict __

La fonction dir permet de trouver les méthodes de l'objet, l'attribut __ dict __ ses attributs.

L'héritage

En gros, l'héritage permet de faire une sous-classe qui possède les mêmes attributs plus d'autres attributs spécifiques et d'autres méthodes, ou à l'inverse une super-classe qui en possède moins. Cette méthode permet de simplifier le code.

Syntaxe de l'héritage

class Epargne:

    def __init__(self, interets, capitalinitial):
        self.interets = interets
        self.capitalinitial = capitalinitial

On peut à partir de cette classe créer une sous-classe qui va rajouter des éléments

class SousEpargne(Epargne):
    def argent(self):
        print("J'aime l'argent")

On peut également remplacer les fonctions compléter les attributs:

class SousEpargne(Epargne):
    def __init__(self, interets, capitalinitial, banque):
        self.interets = interets
        self.capitalinitial = capitalinitial
        self.banque = banque

Surcharge des méthodes

Lorsqu'une méthode a la même signature dans la classe enfant, elle prédomine sur la méthode de la classe parent.

En revanche il est possible d'accéder aux méthodes des parents depuis les classes enfants. (en utilisant la méthode super()).

Classes abstraites

On peut créer une classe abstraite qui ne peut être instanciée et ne peut servir que pour des sous-classes. On utilise ABC:

from abc import ABC

class abstraite(ABC):
    def area(self):
        return 0

Autres fonctionnalités de l'héritage

Mise en application

Pour bien comprendre la programmation orientée objet, j'ai simplement fait des exercices sur internet sur un site en anglais, pour me familiariser avec les objets python.