Python Glossary English

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Сообщить о неточности