Accéder au contenu principal

Programmation orientée objet en Python (OOP) : Tutoriel

Abordez les bases de la programmation orientée objet (POO) en Python : explorez les classes, les objets, les méthodes d'instance, les attributs et bien plus encore !
Actualisé 14 nov. 2024  · 12 min de lecture

La programmation orientée objet est un concept largement utilisé pour écrire des applications puissantes. En tant que data scientist, vous serez amené à écrire des applications pour traiter vos données, entre autres choses. Dans ce tutoriel, vous découvrirez les bases de la programmation orientée objet en Python. Vous apprendrez ce qui suit :

  • Comment créer une classe
  • Instancier des objets
  • Ajouter des attributs à une classe
  • Définir des méthodes à l'intérieur d'une classe
  • Passer des arguments aux méthodes
  • Comment la POO peut-elle être utilisée en Python pour la finance ?

OOP : Introduction

La programmation orientée objet présente certains avantages par rapport à d'autres modèles de conception. Le développement est plus rapide et moins coûteux, avec une meilleure maintenabilité du logiciel. Cela permet d'obtenir des logiciels de meilleure qualité, qui sont également extensibles grâce à de nouvelles méthodes et de nouveaux attributs. La courbe d'apprentissage est cependant plus raide. Le concept peut être trop complexe pour les débutants. D'un point de vue informatique, les logiciels OOP sont plus lents et utilisent plus de mémoire car il faut écrire plus de lignes de code.

La programmation orientée objet est basée sur le paradigme de la programmation impérative, qui utilise des instructions pour modifier l'état d'un programme. Il se concentre sur la description du fonctionnement d'un programme. Des exemples de langages de programmation impératifs sont C, C++, Java, Go, Ruby et Python. Cela contraste avec la programmation déclarative, qui se concentre sur ce que le programme informatique doit accomplir, sans spécifier comment. Les langages d'interrogation de bases de données tels que SQL et XQuery en sont des exemples : ils indiquent à l'ordinateur les données à interroger à partir d'un endroit donné, mais aussi la manière de le faire.

La POO utilise le concept d'objets et de classes. Une classe peut être considérée comme un "plan" pour les objets. Ceux-ci peuvent avoir leurs propres attributs (caractéristiques qu'ils possèdent) et méthodes (actions qu'ils effectuent).

Exemple OOP

Un exemple de classe est la classe Dog. Ne pensez pas qu'il s'agit d'un chien en particulier ou de votre propre chien. Nous décrivons ce qu' est un chien et ce qu'il peut faire, en général. Les chiens ont généralement un name et un age; ce sont des attributs d'instance. Les chiens peuvent également se rendre sur le site bark; il s'agit d'une méthode.

Lorsque vous parlez d'un chien spécifique, vous avez un objet en programmation : un objet est une instanciation d'une classe. C'est le principe de base sur lequel repose la programmation orientée objet. Ainsi, mon chien Ozzy, par exemple, appartient à la classe Dog. Ses attributs sont name = 'Ozzy' et age = '2'. Un chien différent aura des attributs différents.

Programmation orientée objet en Python

Python est-il orienté objet ?

Python est un excellent langage de programmation qui prend en charge la POO. Vous l'utiliserez pour définir une classe avec des attributs et des méthodes, que vous appellerez ensuite. Python offre un certain nombre d'avantages par rapport à d'autres langages de programmation comme Java, C++ ou R. C'est un langage dynamique avec des types de données de haut niveau. Cela signifie que le développement est beaucoup plus rapide qu'avec Java ou C++. Il n'oblige pas le programmeur à déclarer les types de variables et d'arguments. Cela rend également Python plus facile à comprendre et à apprendre pour les débutants, son code étant plus lisible et intuitif.

Si vous êtes novice en Python, ne manquez pas de jeter un œil au cours Intro to Python for Data Science de DataCamp.

Comment créer une classe

Pour définir une classe en Python, vous pouvez utiliser le mot-clé class, suivi du nom de la classe et de deux points. Dans la classe, une méthode __init__ doit être définie avec def. Il s'agit de l'initialisateur que vous pourrez utiliser ultérieurement pour instancier des objets. Il est similaire à un constructeur en Java. __init__ doit toujours être présent ! Il prend un argument : self, qui fait référence à l'objet lui-même. À l'intérieur de la méthode, le mot-clé pass est utilisé dès à présent, car Python s'attend à ce que vous tapiez quelque chose à cet endroit. N'oubliez pas de respecter l'indentation !

class Dog:

    def __init__(self):
        pass

Remarque: self en Python est équivalent à this en C++ ou Java.

Dans ce cas, vous avez une classe Dog (en grande partie vide), mais pas encore d'objet. Créons-en un !

Commencez à apprendre Python gratuitement

Programmation orientée objet en Python

BeginnerSkill Level
4
81.9K learners
Plongez dans cette expérience et apprenez à créer des classes et à tirer parti de l'héritage et du polymorphisme pour réutiliser et optimiser le code.
See DetailsRight Arrow

Python intermédiaire

BeginnerSkill Level
4
1.1M learners
Mettez à niveau vos compétences en science des données en créant des visualisations à l'aide de Matplotlib et en manipulant des DataFrame avec pandas.

Instancier des objets

Pour instancier un objet, tapez le nom de la classe, suivi de deux parenthèses. Vous pouvez l'assigner à une variable pour garder une trace de l'objet.

ozzy = Dog()

Et imprimez-la :

print(ozzy)

<__main__.Dog object at 0x111f47278>

Ajouter des attributs à une classe

Après avoir imprimé ozzy, il est clair que cet objet est un chien. Mais vous n'avez pas encore ajouté d'attributs. Donnons un nom et un âge à la classe Dog en la réécrivant :

class Dog:

    def __init__(self, name, age):  
        self.name = name
        self.age = age

Vous pouvez constater que la fonction prend maintenant deux arguments après self: name et age. Ceux-ci sont ensuite assignés respectivement à self.name et self.age. Vous pouvez maintenant créer un nouvel objet ozzy avec un nom et un âge :

ozzy = Dog("Ozzy", 2)

Pour accéder aux attributs d'un objet en Python, vous pouvez utiliser la notation point. Pour ce faire, saisissez le nom de l'objet, suivi d'un point et du nom de l'attribut.

print(ozzy.name)

print(ozzy.age)
Ozzy
2

Ces éléments peuvent également être combinés dans une phrase plus élaborée :

print(ozzy.name + " is " + str(ozzy.age) + " year(s) old.")
Ozzy is 2 year(s) old.

La fonction str() est utilisée ici pour convertir l'attribut age, qui est un entier, en une chaîne de caractères, afin que vous puissiez l'utiliser dans la fonction print().

Définir des méthodes dans une classe

Maintenant que vous avez une classe Dog, elle a un nom et un âge, que vous pouvez suivre, mais elle ne fait rien en réalité. C'est là que les méthodes d'instance entrent en jeu. Vous pouvez réécrire la classe pour y inclure une méthode bark(). Remarquez que le mot-clé def est à nouveau utilisé, ainsi que l'argument self.

class Dog:

    def __init__(self, name, age):  
        self.name = name
        self.age = age

    def bark(self):
        print("bark bark!")

La méthode bark peut maintenant être appelée en utilisant la notation point, après avoir instancié un nouvel objet ozzy. La méthode doit imprimer "bark bark !" à l'écran. Remarquez les parenthèses (curly brackets) dans .bark(). Ils sont toujours utilisés lors de l'appel d'une méthode. Ils sont vides dans ce cas, puisque la méthode bark() ne prend aucun argument.

ozzy = Dog("Ozzy", 2)

ozzy.bark()
bark bark!

Vous vous souvenez de la façon dont vous avez imprimé ozzy plus tôt ? Le code ci-dessous implémente maintenant cette fonctionnalité dans la classe Dog, avec la méthode doginfo(). Vous instanciez ensuite des objets avec différentes propriétés et vous appelez la méthode sur ces objets.

class Dog:

    def __init__(self, name, age):  
        self.name = name
        self.age = age

    def bark(self):
        print("bark bark!")

    def doginfo(self):
        print(self.name + " is " + str(self.age) + " year(s) old.")

ozzy = Dog("Ozzy", 2)
skippy = Dog("Skippy", 12)
filou = Dog("Filou", 8)

ozzy.doginfo()
skippy.doginfo()
filou.doginfo()
Ozzy is 2 year(s) old.
Skippy is 12 year(s) old.
Filou is 8 year(s) old.

Comme vous pouvez le constater, vous pouvez appeler la méthode doginfo() sur des objets avec la notation point. La réponse dépend maintenant de l'objet Dog sur lequel vous appelez la méthode.

Comme les chiens vieillissent, il serait bon que vous puissiez adapter leur âge en conséquence. Ozzy vient d'avoir 3 ans, changeons son âge.

ozzy.age = 3

print(ozzy.age)
3

Il suffit d'attribuer une nouvelle valeur à l'attribut. Vous pouvez également implémenter cette méthode sous la forme d'une méthode birthday() dans la classe Dog :

class Dog:

    def __init__(self, name, age):  
        self.name = name
        self.age = age

    def bark(self):
        print("bark bark!")

    def doginfo(self):
        print(self.name + " is " + str(self.age) + " year(s) old.")

    def birthday(self):
        self.age +=1

ozzy = Dog("Ozzy", 2)

print(ozzy.age)
2
ozzy.birthday()

print(ozzy.age)
3

Maintenant, vous n'avez plus besoin de modifier manuellement l'âge du chien. Chaque fois que c'est son anniversaire, il vous suffit d'appeler la méthode birthday()

Passer des arguments aux méthodes

Vous souhaitez que nos chiens aient un compagnon. Cela devrait être facultatif, car tous les chiens ne sont pas aussi sociables. Jetez un coup d'œil à la méthode setBuddy() ci-dessous. Il prend self, comme d'habitude, et buddy comme arguments. Dans ce cas, buddy sera un autre objet Dog. Définissez l'attribut self.buddy sur buddy, et l'attribut buddy.buddy sur self. Cela signifie que la relation est réciproque ; vous êtes le copain de votre copain. Dans ce cas, Filou sera le copain d'Ozzy, ce qui signifie qu'Ozzy devient automatiquement le copain de Filou. Vous pourriez également définir ces attributs manuellement au lieu de définir une méthode, mais cela nécessiterait plus de travail (écrire deux lignes de code au lieu d'une) chaque fois que vous voulez définir un copain. Remarquez qu'en Python, vous n'avez pas besoin de préciser le type de l'argument. S'il s'agissait de Java, ce serait obligatoire.

class Dog:

    def __init__(self, name, age):  
        self.name = name
        self.age = age

    def bark(self):
        print("bark bark!")

    def doginfo(self):
        print(self.name + " is " + str(self.age) + " year(s) old.")

    def birthday(self):
        self.age +=1

    def setBuddy(self, buddy):
        self.buddy = buddy
        buddy.buddy = self

Vous pouvez maintenant appeler la méthode avec la notation point et lui transmettre un autre objet Dog. Dans ce cas, le copain d'Ozzy sera Filou :

ozzy = Dog("Ozzy", 2)
filou = Dog("Filou", 8)

ozzy.setBuddy(filou)

Si vous voulez maintenant obtenir des informations sur le copain d'Ozzy, vous pouvez utiliser deux fois la notation par points : Une première fois pour faire référence au copain d'Ozzy, et une seconde fois pour faire référence à son attribut.

print(ozzy.buddy.name)
print(ozzy.buddy.age)
Filou
8

Remarquez que cela peut également être fait pour Filou.

print(filou.buddy.name)
print(filou.buddy.age)
Ozzy
2

Les méthodes de l'ami peuvent également être appelées. L'argument self qui est transmis à doginfo() est maintenant ozzy.buddy, qui est filou.

 ozzy.buddy.doginfo()
Filou is 8 year(s) old.

Exemple de POO en Python

Un exemple de cas où la programmation orientée objet en Python peut s'avérer utile est notre site Python For Finance : Algorithmic Trading tutoriel. Nous y expliquons comment mettre en place une stratégie de trading pour un portefeuille d'actions. La stratégie de trading est basée sur la moyenne mobile du prix d'une action. Si signals['short_mavg'][short_window:] > signals['long_mavg'][short_window:] est rempli, un signal est créé. Ce signal est une prédiction de l'évolution future du cours de l'action. Dans le code ci-dessous, vous verrez qu'il y a d'abord une initialisation, suivie du calcul de la moyenne mobile et de la génération du signal. Comme il ne s'agit pas d'un code orienté objet, c'est un gros morceau qui est exécuté en une seule fois. Notez que nous utilisons aapl dans l'exemple, qui est le symbole boursier d'Apple. Si vous vouliez faire cela pour une autre action, vous devriez réécrire le code.

# Initialize
short_window = 40
long_window = 100
signals = pd.DataFrame(index=aapl.index)
signals['signal'] = 0.0

# Create short simple moving average over the short window
signals['short_mavg'] = aapl['Close'].rolling(window=short_window, min_periods=1, center=False).mean()

# Create long simple moving average over the long window
signals['long_mavg'] = aapl['Close'].rolling(window=long_window, min_periods=1, center=False).mean()

# Create signals
signals['signal'][short_window:] = np.where(signals['short_mavg'][short_window:] > signals['long_mavg'][short_window:], 1.0, 0.0)   

# Generate trading orders
signals['positions'] = signals['signal'].diff()

# Print `signals`
print(signals)

Dans une approche orientée objet, vous ne devez écrire qu'une seule fois le code d'initialisation et de génération des signaux. Vous pouvez ensuite créer un nouvel objet pour chaque action sur laquelle vous souhaitez calculer une stratégie et appeler la méthode generate_signals(). Remarquez que le code OOP est très similaire au code ci-dessus, avec l'ajout de self.

class MovingAverage():

    def __init__(self, symbol, bars, short_window, long_window):
        self.symbol = symbol
        self.bars = bars
        self.short_window = short_window
        self.long_window = long_window

    def generate_signals(self):
        signals = pd.DataFrame(index=self.bars.index)
        signals['signal'] = 0.0

        signals['short_mavg'] = bars['Close'].rolling(window=self.short_window, min_periods=1, center=False).mean()
        signals['long_mavg'] = bars['Close'].rolling(window=self.long_window, min_periods=1, center=False).mean()

        signals['signal'][self.short_window:] = np.where(signals['short_mavg'][self.short_window:] > signals['long_mavg'][self.short_window:], 1.0, 0.0)   

        signals['positions'] = signals['signal'].diff()   

        return signals

Vous pouvez désormais simplement instancier un objet, avec les paramètres que vous souhaitez, et générer des signaux pour lui.

apple = MovingAverage('aapl', aapl, 40, 100)
print(apple.generate_signals())

Faire de même pour une autre action devient très facile. Il s'agit simplement d'instancier un nouvel objet avec un symbole boursier différent.

microsoft = MovingAverage('msft', msft, 40, 100)
print(microsoft.generate_signals())

Programmation orientée objet en Python : Synthèse

Nous avons abordé quelques-uns des principaux concepts de la POO en Python. Vous savez maintenant comment déclarer des classes et des méthodes, instancier des objets, définir leurs attributs et appeler des méthodes d'instance. Ces compétences vous seront utiles au cours de votre future carrière en tant que data scientist. Si vous souhaitez développer les concepts clés dont vous avez besoin pour travailler davantage avec Python, ne manquez pas de consulter notre cours Python intermédiaire pour la science des données.

Avec la POO, votre code deviendra de plus en plus complexe au fur et à mesure que votre programme s'étoffera. Vous aurez différentes classes, sous-classes, objets, héritage, méthodes d'instance, etc. Vous devez veiller à ce que votre code soit correctement structuré et lisible. Pour ce faire, il est conseillé de suivre des modèles de conception. Il s'agit de principes de conception qui représentent un ensemble de lignes directrices permettant d'éviter une mauvaise conception. Ils représentent chacun un problème spécifique qui revient souvent dans la POO de Python et décrivent la solution à ce problème, qui peut ensuite être utilisée de manière répétée. Ces schémas de conception OOP peuvent être classés en plusieurs catégories : les schémas de création, les schémas structurels et les schémas comportementaux. Un exemple de modèle de création est le singleton, qui doit être utilisé lorsque vous voulez vous assurer qu'une seule instance d'une classe peut être créée. Un itérateur Python, qui est utilisé pour parcourir en boucle tous les objets d'une collection, est un exemple de modèle comportemental.

FAQ sur la POO Python

Qu'est-ce que la programmation orientée objet (POO) ?

La programmation orientée objet est un paradigme de programmation basé sur le concept d'"objets", qui peuvent contenir des données et du code qui manipule ces données. Dans la POO, les objets sont créés à partir de modèles appelés "classes", qui définissent les propriétés et le comportement des objets qu'ils créent. La POO vous permet de créer un code réutilisable et de modéliser plus étroitement les concepts du monde réel, ce qui en fait un choix populaire pour de nombreux projets logiciels.

Que sont les classes et les objets en Python ?

En Python, une classe est un modèle permettant de créer des objets. Il définit les propriétés et le comportement des objets qui sont créés à partir de lui. Un objet est une instance d'une classe, créée en appelant la classe comme une fonction. L'objet contient les données et le comportement définis par la classe, ainsi qu'une identité unique.

Comment définir une classe en Python ?

Pour définir une classe en Python, vous utilisez le mot-clé class, suivi du nom de la classe et de deux points. La définition de la classe est indentée et le bloc indenté contient les propriétés et les méthodes (fonctions) qui appartiennent à la classe.

Comment créer un objet à partir d'une classe en Python ?

Pour créer un objet à partir d'une classe en Python, vous appelez la classe comme une fonction, en passant tous les arguments nécessaires au constructeur de la classe (la méthode __init__). 

Sujets

En savoir plus sur Python

Certification disponible

cours

Programmation orientée objet en Python

4 hr
77.2K
Plongez dans cette expérience et apprenez à créer des classes et à tirer parti de l'héritage et du polymorphisme pour réutiliser et optimiser le code.
Afficher les détailsRight Arrow
Commencer Le Cours
Voir plusRight Arrow