Python 3.5+Аннотации и typingпонятие
ClassVar
атрибуты
Указывает, что переменная является переменной класса, а не экземпляра. Не должна присваиваться через self.
Синтаксис
from typing import ClassVar
class MyClass:
attr: ClassVar[type] = value
Сама аннотация ничего не запрещает — присваивание через self всё равно создаст атрибут экземпляра, который затенит классовый, и укажет на это только статический анализатор. Настоящий эффект ClassVar проявляется в dataclass: поле с такой аннотацией не попадает ни в сгенерированный __init__, ни в fields() и остаётся обычной константой класса. Помните и про общий подвох классовых атрибутов: изменяемый список или словарь один на всех, и правка на месте видна из каждого экземпляра.
Примеры
from typing import ClassVar
class Counter:
count: ClassVar[int] = 0
def __init__(self): Counter.count += 1
c1 = Counter()
c2 = Counter()
print(Counter.count) # → 2
from typing import ClassVar
class Config:
debug: ClassVar[bool] = False
host: str = 'localhost'
print(Config.debug) # → False
print(Config.host) # → localhost
Config.debug = True
print(Config.debug) # → True
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности