Résolue

ClassVar

# Orienté objet

from typing import ClassVar

@class User:
    first_name: str
    last_name : str
    c: ClassVar[int]

Si je comprends bien ce cas, en fait ClassVar permet de créer une variable de classe - dans d'autres langage cela s'appellerait une variable static ?

Thibault houdon

Mentor

Salut Al !

En Python c'est un peu différent, ClassVar est utilisé uniquement pour le typage, afin d'indiquer qu'une variable est une variable de classe (et non une variable d'instance).

ClassVar est donc surtout utilisé avec le module typing pour donner des indications aux développeurs et aux outils qui vérifient le type des variables dans le code (comme des analyseurs statiques de code ou ton IDE). Du coup, ClassVar ne modifie pas réellement le comportement du code, il s'agit plutôt d'une annotation qui aide à la compréhension et sert de documentation pour indiquer que cette variable doit être utilisée comme une variable de classe.

Si tu veux définir une variable de classe en Python, tu la déclares dans le corps de la classe, mais en dehors de toute méthode, comme ceci :

class User:
    c = 0  # variable de classe

    def __init__(self, first_name: str, last_name: str):
        self.first_name = first_name
        self.last_name = last_name

Dans le code ci-dessus, c sera partagée par toutes les instances de la classe User, ce qui est si je me souviens bien, équivalent au concept de variable statique dans d'autres langages.

Également attention, je ne sais pas si c'est une typo, mais pour définir une classe il faut juste utiliser class et non @class (le @ est utilisé pour les décorateurs). Si tu voulais définir User comme une classe, tu devrais écrire :

from typing import ClassVar

class User:
    first_name: str
    last_name: str
    a: ClassVar[int] = 0  # c est une variable de classe, avec une annotation de type

Et c est maintenant une variable de classe avec l'annotation de type que les outils peuvent utiliser pour vérifier que tu l'utilises correctement :)

J'espère que c'est plus clair !

Si je comprends - lorsqu'on veut une variable de classe et qu'on n'utilise pas la méthode "init" ClassVar nous le permet ?

Thibault houdon

Mentor

Pas exactement, ClassVar sert uniquement pour les annotations de type, tu peux totalement t'en passer, ça a été rajouté dans les dernières versions de Python pour aider à déceler les problèmes avec des outils qui permettent d'analyser ton code (ou dans ton IDE, si tu indiques dans une fonction par exemple qu'un paramètre doit être une str et que tu lui passes un int, ça sera surligné comme un problème potentiel).

Tu peux tout à fait faire une classe avec une variable de classe et une variable d'instance sans aucune annotation de type :

class User:
    a = 0  # variable de classe

    def __init__(self, prenom):
        self.prenom = prenom  # variable d'instance

Tu peux du coup faire ça :

utilisateur = User(prenom="Al")
utilisateur.a = 10

Et ton IDE ou un linter ne t'avertirons pas qu'il y a un problème.

Maintenant tu peux rajouter une annotation de type :

from typing import ClassVar
class User:
    a: ClassVar[int] = 0  # variable de classe

    def __init__(self, prenom):
        self.prenom = prenom  # variable d'instance

Et si tu refais le même code, ton IDE t'indiquera un problème :

utilisateur = User(prenom="Al")
utilisateur.a = 10  # tu modifies une variable de classe sur ton instance : warning !

Dans PyCharm :
Warning classvar
Cannot assign

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.