Python - Class Attributes (Attributs de classe)
Bonjour, aspirants programmeurs ! Aujourd'hui, nous allons plonger dans le monde passionnant des attributs de classe en Python. Ne vous inquiétez pas si vous êtes nouveau en programmation ; je vais vous guider étape par étape au cours de ce voyage, tout comme je l'ai fait pour d'innombrables étudiants au fil des années. Alors, mettons-nous en route !
Attributs de classe (Variables)
Les attributs de classe sont des variables qui appartiennent à l'ensemble de la classe plutôt qu'à une instance spécifique de la classe. Pensez à eux comme des caractéristiques partagées par tous les objets de cette classe.
Commençons par un exemple simple :
class Chien:
espèce = "Canis familiaris"
def __init__(self, nom, âge):
self.nom = nom
self.âge = âge
fluffy = Chien("Fluffy", 3)
buddy = Chien("Buddy", 5)
print(Chien.espèce) # Sortie : Canis familiaris
print(fluffy.espèce) # Sortie : Canis familiaris
print(buddy.espèce) # Sortie : Canis familiaris
Dans cet exemple, espèce
est un attribut de classe. Il est défini directement à l'intérieur de la classe, mais en dehors de tous les méthodes. Tous les objets Chien
partagent cet attribut.
Accès aux attributs de classe
Comme vous pouvez le voir dans l'exemple ci-dessus, vous pouvez accéder aux attributs de classe de deux manières :
- À travers la classe elle-même :
Chien.espèce
- À travers toute instance de la classe :
fluffy.espèce
oubuddy.espèce
Les deux méthodes vous donneront le même résultat. C'est comme demander, "Quelle est l'espèce des chiens ?" ou "Quelle est l'espèce de Fluffy ?" - la réponse est la même !
Modification des attributs de classe
Les attributs de classe peuvent être modifiés, mais soyez prudent ! Lorsque vous modifiez un attribut de classe, il change pour toutes les instances de la classe. Voyons un exemple :
class Chat:
espèce = "Felis catus"
compteur = 0
def __init__(self, nom):
self.nom = nom
Chat.compteur += 1
whiskers = Chat("Whiskers")
mittens = Chat("Mittens")
print(Chat.compteur) # Sortie : 2
print(whiskers.compteur) # Sortie : 2
print(mittens.compteur) # Sortie : 2
Chat.espèce = "Felis silvestris catus"
print(Chat.espèce) # Sortie : Felis silvestris catus
print(whiskers.espèce) # Sortie : Felis silvestris catus
print(mittens.espèce) # Sortie : Felis silvestris catus
Dans cet exemple, nous utilisons un attribut de classe compteur
pour suivre le nombre de chats que nous avons créés. Chaque fois que nous créons un nouveau objet Chat
, nous incrémentons Chat.compteur
. Nous avons également changé l'espèce
pour tous les chats d'un coup en modifiant Chat.espèce
.
Signification des attributs de classe
Les attributs de classe sont extrêmement utiles dans plusieurs scénarios :
- Stocker des constantes qui devraient être les mêmes pour toutes les instances d'une classe.
- Suivre les données à travers toutes les instances d'une classe (comme notre exemple
Chat.compteur
). - Définir des valeurs par défaut qui peuvent être remplacées par des instances si nécessaire.
Attributs de classe intégrés
Les classes Python viennent avec certains attributs intégrés qui peuvent être très utiles. Regardons quelques-uns :
class MaClasse:
x = 5
def ma_méthode(self):
pass
print(MaClasse.__name__) # Sortie : MaClasse
print(MaClasse.__doc__) # Sortie : None (parce que nous n'avons pas fourni de docstring)
print(MaClasse.__dict__) # Sortie : {'__module__': '__main__', 'x': 5, 'ma_méthode': <function MaClasse.ma_méthode at ...>}
print(MaClasse.__module__) # Sortie : __main__
Accès aux attributs de classe intégrés
Voici un tableau des attributs intégrés courants et de la manière dont on y accède :
Attribut | Description | Accès |
---|---|---|
name | Nom de la classe | MaClasse.name |
doc | Docstring de la classe | MaClasse.doc |
dict | Dictionnaire contenant l'espace de noms de la classe | MaClasse.dict |
module | Nom du module dans lequel la classe est définie | MaClasse.module |
bases | Tuple contenant les classes de base | MaClasse.bases |
Attributs d'instance
Maintenant que nous comprenons les attributs de classe, touchons brièvement aux attributs d'instance pour voir la différence. Les attributs d'instance sont spécifiques à chaque objet créé à partir de la classe.
class Étudiant:
école = "Python High" # Attribut de classe
def __init__(self, nom, classe):
self.nom = nom # Attribut d'instance
self.classe = classe # Attribut d'instance
alice = Étudiant("Alice", 10)
bob = Étudiant("Bob", 11)
print(Étudiant.école) # Sortie : Python High
print(alice.école) # Sortie : Python High
print(bob.école) # Sortie : Python High
print(alice.nom) # Sortie : Alice
print(bob.nom) # Sortie : Bob
Étudiant.école = "Python University"
print(alice.école) # Sortie : Python University
print(bob.école) # Sortie : Python University
alice.école = "Python Elementary"
print(alice.école) # Sortie : Python Elementary
print(Étudiant.école) # Sortie : Python University
print(bob.école) # Sortie : Python University
Attributs d'instance Vs Attributs de classe
Les principales différences entre les attributs d'instance et les attributs de classe sont :
- Les attributs de classe sont partagés par toutes les instances, tandis que les attributs d'instance sont uniques à chaque instance.
- Les attributs de classe sont définis dans la classe mais en dehors de toutes les méthodes, tandis que les attributs d'instance sont généralement définis à l'intérieur de la méthode
__init__
. - Changer un attribut de classe affecte toutes les instances (à moins qu'une instance ne l'ait écrasé), tandis que changer un attribut d'instance n'affecte que cette instance spécifique.
N'oubliez pas, lorsque vous essayez d'accéder à un attribut sur une instance, Python recherche d'abord un attribut d'instance. Si il ne le trouve pas, il recherche ensuite un attribut de classe. C'est pourquoi nous pouvons "écraser" un attribut de classe pour une instance spécifique en créant un attribut d'instance avec le même nom.
Et voilà ! Vous venez de terminer un cours accéléré sur les attributs de classe en Python. N'oubliez pas que la clé de la maîtrise de la programmation est la pratique. Alors, n'hésitez pas à expérimenter avec ces concepts. Créez vos propres classes, jouez avec les attributs et voyez ce qui se passe. Bon codage !
Credits: Image by storyset