Attributs et instances de classe¶
Rappels¶
Voici un exemple de classe qui contient une méthode:
class MaClasse
def ma_méthode(self):
print(self.mon_attribut)
Le bloc indenté en-dessous du mot-clé class
s’appelle le
corps de la classe. Et les méthodes sont définies avec le
mot-clé def
dans le corps de la classe.
On dit que ce sont des méthodes d’instance par ce qu’il faut créer une instance pour pouvoir les appeler:
mon_instance = MaClasse()
mon_instance.ma_méthode()
Attributs de classes¶
On peut également déclarer des variables dans le corps d’une classe.
On crée ainsi des attributs de classe:
class MaClasse:
mon_attribut_de_classe = 42
Ici mon_attribut_de_classe
existe à la fois dans les instances de MaClasse
et dans la classe elle-même:
print(MaClasse.mon_attribut_de_classe)
# affiche 42
mon_instance = MaClasse()
print(mon_instance.mon_attribut_de_classe)
# affiche 42
Un point important est que les attributs de classe sont partagés entre toutes les instances. Voici un exemple d’utilisation possible:
class Voiture:
nombre_total_de_voitures_fabriquées = 0
def __init__(self, marque, couleur):
print("Construction d'une", marque, couleur)
Voiture.nombre_total_de_voitures_fabriquées += 1
ferrari_1 = Voiture("Ferrari", "rouge")
mercedes_1 = Voiture("Mercedes, "noire")
ferrari_2 = Voiture("Ferrari", "rouge")
print("total:", Voiture.nombre_total_de_voitures_fabriquées)
# Affiche:
# Construction d'une Ferrari rouge
# Construction d'une Mercedes noire
# Construction d'une Ferrari rouge
# total: 3
Notez que pour changer l’attribut de classe depuis une méthode, (comme dans le méthode
__init__
ci-dessus) on utilise le nom de la classe directement, et non pas self
.
Méthodes de classes¶
On peut aussi définir des méthodes de classes avec le décorateur classmethod
Dans ce cas, le permier argument s’appelle cls
et prend la valeur de la classe
elle-même. Pour poursuivre sur notre exemple:
class Voiture:
nombre_total_de_voitures_fabriquées = 0
def __init__(self, marque, couleur):
print("Construction d'une", marque, couleur)
Voiture.nombre_total_de_voitures_fabriquées += 1
@classmethod
def fabrique_ferrari(cls):
return cls("ferrari", "rouge")
ferrari = Voiture.fabrique_ferrari()
Détaillons ce qu’il se passe sur la dernière ligne:
à gauche du égal il y a une variable et à droite une expression(Voiture.fabrique_ferrari()
)
L’expression est constitué d’une classe à gauche du point (Voiture
) et
d’un attribut à droite du point fabrique_ferrari
suivi de parenthèses.
Comme fabrique_ferrari
est une méthode de classe, on va appeler la méthode
de classe fabrique_ferrari
en lui passant la classe Courante en argument.
On arrive ainsi dans le corps de la méthode de classe fabrique_ferrari
, et
cls
vaut la classe Voiture.
Finalement, on évalue l’expression cls("ferrari", rouge")
en remplaçant
cls
par sa valeur, ce qui donne Voiture("ferrari", "rouge")
qui
correspond bien à ce qu’on obtient : une instance de la classe Voiture.