Variables de classe et d’instance

Distinction entre les variables de classe et d’instance expliquée.

Rachit Tayal
Rachit Tayal

Follow

Jun 9, 2019 – 3 min de lecture

Les variables sont essentiellement des symboles qui représentent une valeur que nous utilisons dans un programme. La programmation orientée objet permet d’utiliser les variables au niveau de la classe ou de l’instance. L’objectif de cet article est d’établir une distinction claire entre les types de variables offerts par le modèle objet de Python et de discuter d’un comportement particulier qui pourrait conduire à des résultats surprenants, s’il est négligé. Alors creusons !
Selon le modèle objet de Python, il existe deux types d’attributs de données sur les objets Python : les variables de classe et les variables d’instance.

Variables de classe – Déclarées à l’intérieur de la définition de la classe (mais en dehors de toute méthode d’instance). Elles ne sont pas liées à un objet particulier de la classe, donc partagées entre tous les objets de la classe. Modifier une variable de classe affecte tous les objets instance en même temps.

Variable d’instance – Déclarée à l’intérieur de la méthode constructeur de la classe (la méthode __init__). Elles sont liées à l’instance particulière de l’objet de la classe, donc le contenu d’une variable d’instance est complètement indépendant d’une instance d’objet à l’autre.

Débutons par un exemple court et facile à digérer :

class Car:
wheels = 4 # <- Class variable def __init__(self, name):
self.name = name # <- Instance variable

Au-dessus se trouve la classe Car de base, sans fioritures, définie. Chaque instance de celle-ci aura la variable de classe roues avec le nom de la variable d’instance. Instançons la classe pour accéder aux variables.

>>> jag = Car('jaguar')
>>> fer = Car('ferrari')>>> jag.name, fer.name
('jaguar', 'ferrari')>>> jag.wheels, fer.wheels
(4, 4)>>> Car.wheels
4

Accéder au nom de la variable d’instance est assez simple. Cependant, il y a un peu plus de flexibilité lorsqu’il s’agit d’accéder à la variable de classe. Comme ci-dessus, nous pouvons accéder aux roues via l’instance de l’objet ou la classe elle-même.

Essayer également d’accéder au nom via la classe entraînera une AttributeError puisque les variables d’instance sont spécifiques à l’objet et sont créées lorsque le constructeur __init__ est invoqué. C’est la distinction centrale entre la classe et les variables d’instance.

>>> Car.name
AttributeError: type object 'Car' has no attribute 'name'

Maintenant, supposons pour le moment que notre voiture Jaguar a 3 roues. (oui, c’est stupide mais supportez-le ! ! 😅). Pour représenter cela dans notre code, nous pouvons modifier la variable roues.

>>> Car.wheels = 3

Ce que nous avons fait ci-dessus rendra toutes les voitures avec 3 roues puisque nous avons modifié une variable de classe, qui s’appliquera à toutes les instances de la classe Car.

>>> jag.wheels, fer.wheels
(3, 3)

Par conséquent, modifier une variable de classe sur l’espace de nom de la classe affecte toutes les instances de la classe. Annulons le changement et modifions la variable wheels en utilisant l’objet jag.

>>> Car.wheels = 4
>>> jag.wheels = 3

Cela nous donnera le résultat que nous désirons.

>>> jag.wheels, fer.wheels, Car.wheels
(3, 4, 4)

Bien que nous ayons obtenu le résultat que nous voulions, mais ce qui s’est passé en coulisse est une nouvelle variable wheels qui a été ajoutée à l’objet jag et cette nouvelle variable ombrage la variable de classe avec le même nom, la surchargeant et la cachant. Nous pouvons accéder aux deux variables roues comme ci-dessous.

>>> jag.wheels, jag.__class__.wheels
(3, 4)

Hence nous pouvons conclure que jag.wheels = 3 a créé une nouvelle variable d’instance avec le même nom que la variable de classe (roues). Il s’agit d’une notion importante à connaître.
L’utilisation de variables spécifiques aux classes et aux instances peut garantir que notre code adhère au principe DRY pour réduire les répétitions dans le code.
Savoir cela, je le sens, peut être vraiment pratique et sauver beaucoup d’heures de débogage un jour. 😇
Référez-vous à mon ce post pour une lecture plus approfondie sur les différents types de méthodes (instance, classe &statique) en Python.

Conclusions

  • Les variables de classe sont partagées entre tous les objets alors que les variables d’instance sont pour les données uniques à chaque instance.
  • La variable d’instance surcharge les variables de classe ayant le même nom ce qui peut accidentellement introduire des bogues ou un comportement surprenant dans notre code.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.