HOWTO · Python
Définir une variable globale de classe en Python
Apprenez à définir un attribut de classe Python dans le corps de la classe, à y accéder avec ClassName.attribute et à le distinguer d'un nom au niveau du module déclaré avec global.
Sur cette page
Une variable de classe Python est un attribut défini dans le corps de la classe. Définissez-la une seule fois sur la classe, puis lisez sa valeur avec ClassName.attribute, par exemple Tesla.speed. Un nom global est distinct : il appartient à l’espace de noms du module et ne devient pas un attribut de classe.
Définir une variable de classe en Python
Affectez la valeur dans le corps de la classe, puis lisez-la en utilisant le nom de la classe. L’exemple montre aussi une méthode et une seconde classe qui lisent le même attribut.
class Tesla:
speed = 60
def show_speed(self):
return Tesla.speed
class Dashboard:
def show_tesla_speed(self):
return Tesla.speed
print(Tesla.speed)
print(Tesla().show_speed())
print(Dashboard().show_tesla_speed())
60
60
60
Ici, speed est stocké sur Tesla : Tesla.speed lit donc l’attribut de classe partagé. La méthode de Tesla et celle de Dashboard utilisent toutes deux le même accès qualifié par le nom de la classe.
Accéder à une variable de classe depuis l’extérieur de sa classe
Utilisez ClassName.attribute partout où la classe est accessible. Par exemple, Tesla.speed fonctionne dans le code au niveau du module et dans la méthode d’une autre classe. Il n’est pas nécessaire de créer une instance pour lire un attribut de classe. À l’extérieur de la classe, un nom nu comme speed ne désigne pas Tesla.speed : Python le recherche dans la portée courante, où il peut ne pas être défini.
Une instance peut aussi définir un attribut du même nom. Par exemple, car.speed = 80 définit un attribut sur cette instance précise de car, tandis que Tesla.speed désigne toujours l’attribut de classe. Utilisez la forme qualifiée par le nom de la classe lorsque vous avez besoin de la valeur partagée.
Pourquoi global ne définit pas une variable de classe
L’instruction global indique à Python qu’une affectation à un nom nu dans un bloc de code doit lier ce nom dans l’espace de noms du module. Dans le corps d’une classe, global speed suivi de speed = 60 crée ou met à jour le nom speed au niveau du module ; cela n’affecte pas Tesla.speed. Pour définir une variable de classe, affectez une valeur, par exemple speed = 60, dans le corps de la classe sans global, puis accédez-y avec Tesla.speed depuis l’extérieur de la classe.
Une méthode qui a besoin de l’attribut de classe peut également utiliser Tesla.speed. Si la méthode doit fonctionner avec les sous-classes, utilisez type(self).speed ou self.speed selon le comportement de recherche souhaité ; self.speed peut désigner un attribut d’instance qui masque l’attribut de classe.