Les attributs ou les propriétés
Le constructeur de classe ou la méthode __init__
Python est un langage de POO (programmation orientée objet), c’est-à-dire, qu’il sert à rapprocher le monde réel à la programmation, cette fonctionnalité ou ce paradigme permet de concevoir des objets de la réalité tels une personne ou un produit ou même un dessin géométrique, tout en se basant sur leurs propriétés et leurs comportements, ainsi que leurs relations et interactions entre eux.
Afin de modéliser ces objets, Python se sert des classes qui sont en fait un point indispensable de la POO. Dans ce tutoriel, on introduira le concept de la POO, et les classes, et leurs intérêts, ainsi que quelques exemples et exercices pour bien les illustrer.
Python utilise la POO (programmation orientée objet) ; un paradigme qui vise à utiliser la programmation pour modéliser le monde réel. On distinguera dans cette partie les différentes notions de la POO.
En POO, chaque objet est indépendant avec une identité unique, comme tous les objets de la réalité. Prenant comme exemple : Une « orange » est un objet de la classe « fruits » qui a une identité unique, il est possible d'avoir plusieurs oranges qui semblent identiques, mais ce sont toujours des objets distincts.
Les objets ont également des caractéristiques ou propriétés qui servent à les décrire. Par exemple, une voiture peut être verte ou noire, ainsi, elle peut être de marque « Mercedes » ou « Renault ». Ces caractéristiques sont également appelées des attributs.
Comme dans le monde réel, chaque objet a des fonctions ou des comportements. Par exemple : une voiture roule ou un avion vol, ces comportements sont également appelés des méthodes.
En d’autres termes, dans la programmation orientée objet, un objet est une instance d'une classe, qui définit son identité, il possède des attributs qui décrivent son état actuel et il dispose des méthodes démontrant ce que l’objet est capable de faire.
Une classe décrit ce que sera l'objet, mais est distincte de l'objet lui-même. En d'autres termes, les classes peuvent être décrites comme des descriptions ou des définitions pour un objet. Vous pouvez utiliser la même classe pour créer plusieurs objets.
La première étape consiste à définir la classe, qui devient alors un modèle pour la création d'objets. Chaque classe a un nom, on considérera comme exemple NomDeClasse.
Par convention, Une classe est définie sur Python telle que : class NomDeClasse : avec le nom de classe commençant par une lettre majuscule.
Par la suite, on définira les attributs de la classe créée, ainsi que leurs valeurs par défaut ou valeurs d’usine (Etant un langage dynamique, Python permet la possibilité de redéfinir le type d’attribut).
Remarque : il est possible de créer une classe sans contenu en utilisant l’instruction pass pour éviter d’avoir une erreur :
class NomDeClasse :
pass
Dans l’exemple suivant, on va créer une classe personne en lui cédant des attributs et leurs valeurs usine.
class Personne :
CIN = "CIN de la personne"
nom = "Nom de la personne"
age = "Age de la personne"
adresse = "Adresse de la personne"
Après la création d’une classe, la dernière étape qui parvient sera de tester notre classe et de créer des objets de cette classe.
La création d’un objet est déterminée telle que : objet = NomDeClass ().
Ainsi, pour faire appel à un attribut associé à un objet : objet.attribut , et pour le modifier il suffit de l’attribuer une nouvelle valeur : objet.attribut = nouvelleValeurDAttribut .
D’autre part, pour supprimer la valeur d’un attribut associé à un objet, on utilise le mot-clé del tel que : del objet.attribut.
En reprenant l’exemple proposé dans la partie précédente, on fera appel à un objet contenant les valeurs définies par défaut lors de la création de la classe.
class Personne :
CIN = "CIN de la personne"
nom = "Nom de la personne"
age = "Age de la personne"
adresse = "Adresse de la personne"
personne_usine = Personne()
print(personne_usine.CIN)
print(personne_usine.nom)
print(personne_usine.age)
print(personne_usine.adresse)
Ainsi, pour affecter des valeurs aux attributs de notre objet de la classe précédente :
class Personne :
CIN = "CIN de la personne"
nom = "Nom de la personne"
age = "Age de la personne"
adresse = "Adresse de la personne"
personne1 = Personne()
personne1.CIN = "A123456"
personne1.nom = "Ismail BOUZIANE"
personne1.age = 24
personne1.adresse = "Apt 1, rue 1, ville 1"
print(personne1.CIN)
print(personne1.nom)
print(personne1.age)
print(personne1.adresse)
Réappliquez l’exemple précédent pour créer une classe Produit sur Python ayant comme attributs : référence, désignation, prix et quantité. Instanciez ces attributs, ainsi que créez des exemples d’objets produits.
class Produit :
référence = "référence du produit"
désignation = "désignation du produit"
prix = "prix du produit"
quantité = "quantité du produit"
produit_ini = Produit()
produit1 = Produit()
produit1.référence = "ABC123"
produit1.désignation = "SMART TV"
produit1.prix = 3999
produit1.quantité = 5
print("l'instanciation des attributs :")
print(produit_ini.référence)
print(produit_ini.désignation)
print(produit_ini.prix)
print(produit_ini.quantité)
print("Exemple d'objet de la classe Produit :")
print(produit1.référence)
print(produit1.désignation)
print(produit1.prix)
print(produit1.quantité)
Le constructeur ou bien la méthode __init__ permet d’initialiser les valeurs par défaut des attributs d’une classe, elle est considérée comme la méthode la plus importante d'une classe, on l’appelle lors de la création d’un objet de classe en utilisant le nom de la classe comme fonction.
Cette méthode est représentée sous forme d’une fonction ayant par convention comme premier paramètre l’attribut qu’on appellera « self », elle peut disposer d’aucun ou de plusieurs paramètres.
Le paramètre « self » permet de faire référence à l'adresse mémoire de l'instance d’un objet de classe déclaré, ainsi, il est utilisé pour accéder aux attributs appartenant à la classe.
Toute méthode de classe, et non pas seulement la méthode __init__, doit contenir ce paramètre.
Remarque : il n'est pas nécessaire d'écrire self tel qu’il est, vous pouvez l'appeler comme vous le souhaitez, mais à condition qu’il soit le premier paramètre de toute méthode de la classe:
En progressant l’exemple de la partie précédente par la méthode __inti__ on aura :
class Personne :
CIN = "CIN de la personne"
nom = "Nom de la personne"
age = "Age de la personne"
adresse = "Adresse de la personne"
def __init__ (self, CIN, nom, age, adresse) :
self.CIN = CIN
self.nom = nom
self.age = age
self.adresse = adresse
personne1 = Personne("A123456","Ismail BOUZIANE",24,"Apt 1, rue 1, ville 1")
print(personne1)
print(personne1.CIN)
print(personne1.nom)
print(personne1.age)
print(personne1.adresse)
Cette méthode ne renvoie aucune valeur, elle est exécutée automatiquement lors de la création d’un objet de la classe.
On progresse l’exercice de l’application de la partie précédente (class Produit) en intégrant la méthode __init__.
class Produit :
référence = "référence du produit"
désignation = "désignation du produit"
prix = "prix du produit"
quantité = "quantité du produit"
def __init__ (self, référence, désignation, prix, quantité) :
self.référence = référence
self.désignation = désignation
self.prix = prix
self.quantité = quantité
produit1 = Produit("ABC123", "SMART TV", 3999, 5)
print(produit1)
print(produit1.référence)
print(produit1.désignation)
print(produit1.prix)
print(produit1.quantité)
Afin de protéger l’accès à un ou plusieurs attributs d’une classe, on utilise les attributs privés, pour en créer, on ajoute deux underscore « __ » avant le nom de l’attribut.
Remarque : il est possible d’attribuer l’accès à ce paramètre qu’on ont veut, en utilisant les accesseurs ou les getters (on introduira ces notions dans une autre partie).
On ajoute à l’exemple précédent, un attribut compte bancaire « cpt_bancaire » qu’on définira comme attribut privé :
class Personne :
CIN = "CIN de la personne"
nom = "Nom de la personne"
age = "Age de la personne"
adresse = "Adresse de la personne"
def __init__ (self, CIN, nom, age, adresse, cpt_bancaire) :
self.CIN = CIN
self.nom = nom
self.age = age
self.adresse = adresse
self.__cpt_bancaire = cpt_bancaire
personne1 = Personne("A123456","Ismail BOUZIANE",24,"Apt 1, rue 1, ville 1","1324456")
print(personne1)
print(personne1.CIN)
print(personne1.nom)
print(personne1.age)
print(personne1.adresse)
print(personne1.__cpt_bancaire)
Il n’est alors plus possible d’avoir accès à l’attribut « cpt_bancaire » depuis l’extérieur de la classe « Personne » :
On souhaite réaliser une classe issue d’un outil classique utilisé régulièrement dans la vie ordinaire : une voiture, tout en suivant la procédure suivante :
Tester votre classe et créer un objet contenant les valeurs par défaut.
__init__ (self, modèle, annéeCréation, puissance, nbPlaces, alimentation, coûtFabri).
Tester votre classe et créer un exemple d’objet.
# Réponse de la première question : Créer une classe Voiture et définir des valeurs par défaut à ses attributs :
class Voiture :
modèle = "Le modèle de la voiture"
annéeCréation = "L’année de création de la voiture"
alimentation = "Le type d’alimentation de la voiture"
nbPlaces = "La capacité de la voiture"
puissance = "La puissance en cheval de la voiture"
coûtFabri = "Le coût de fabrication de la voiture"
# Tester les valeurs par défaut des attributs :
voitureParDéfaut = Voiture()
print(voitureParDéfaut.modèle)
print(voitureParDéfaut.annéeCréation)
print(voitureParDéfaut.puissance)
print(voitureParDéfaut.nbPlaces)
print(voitureParDéfaut.alimentation)
# Réponse de la deuxième question : Redéfinir la classe avec le constructeur ou la méthode __init__ de classe Voiture :
class Voiture :
modèle = "Le modèle de la voiture"
annéeCréation = "L’année de création de la voiture"
alimentation = "Le type d’alimentation de la voiture"
nbPlaces = "La capacité de la voiture"
puissance = "La puissance en cheval de la voiture"
coûtFabri = "Le coût de fabrication de la voiture"
def __init__ (self, modèle, annéeCréation, puissance, nbPlaces, alimentation, coûtFabri) :
self.modèle = modèle
self.annéeCréation = annéeCréation
self.puissance = puissance
self.nbPlaces = nbPlaces
self.alimentation = alimentation
self.__coûtFabri = coûtFabri
# Tester un exemple d'objet :
voiture1 = Voiture("Mercedes", "2004", 200, 4, "Diesel", 123456)
print(voiture1.modèle)
print(voiture1.annéeCréation)
print(voiture1.puissance)
print(voiture1.nbPlaces)
print(voiture1.alimentation)
# Bonus : redéfinition de la valeur de l'attribut modéle :
voiture1.modèle = "Audi"
print(voiture1.modèle)
# Bonus : utilisation de l'instruction del :
del voiture1.puissance
print(voiture1.puissance)
del voiture1.alimentation
print(voiture1.alimentation)
Afin de concevoir le monde réel en programmation et en créer des objets le représentant, il est recommandé de s’équiper par la POO (la programmation orienté objet), qui est utilisée dans plusieurs langages de programmation tel que Python. Dans ce tutoriel enrichi d’exemples et d’exercices, on vous a démontré les notions de base afin de créer et construire une classe sur Python et comment l’utiliser pour créer de différents objets.
En avançant sur les classes ; vous rencontrerez de nouvelles notions tel que les accesseurs, les mutateurs et l’héritage, qui sont nécessaires à découvrir dans une autre partie de ce cours. Merci pour votre attention ! Et bonne chance à vous !