ClassVar marks an attribute as class-level, not instance-level.
1from typing import ClassVar23class User:4 count: ClassVar[int] = 0 # Shared across all instances5 name: str # Instance attribute67 def __init__(self, name):8 self.name = name9 User.count += 11011u1 = User("Alice")12u2 = User("Bob")1314print(User.count) # 215print(u1.count) # 2 (access via instance)16print(u1.name) # "Alice"1718# Type checker understands:19User.count = 5 # OK — class variable20# u1.count = 5 # Warning: setting class var on instance2122# With Pydantic23from pydantic import BaseModel2425class Config(BaseModel):26 debug: ClassVar[bool] = False # Not serialized27 name: str # Serialized2829c = Config(name="test")30print(c.dict()) # {"name": "test"} — no debug!3132# In Django33from django.db import models3435class Article(models.Model):36 MAX_TITLE_LENGTH: ClassVar[int] = 20037 title = models.CharField(max_length=MAX_TITLE_LENGTH)
Benefits: