Позволю поднять эту довольно избитую тему, так как несмотря на поиски и чтение соответствующей документации в Интернете, мое понимание данного вопроса до конца не оформилось.
Итак, вопрос в следующем: есть ли в Python статические аттрибуты классов в том понимании этого термина, которое выработалось в мире C++ и Java?
Предположим, нам необходим статический аттрибут для подсчета количества созданных экземпляров некоторого класса. Что мы делаем в Python (для чистоты буду использовать new-style ООП, хотя в случае с классическим ООП, ситуация, думаю, не изменится):
class C(object):
counter = 0 # вот это “по идее” статический аттрибут
def __init__(self):
C.counter += 1 # во время инициализации нового экземпляра
# увеличиваем общий для всех экземпляров счетчик на 1-цу
Смотрим что получилось:
>>> inst1 = C()
>>> C.counter
1
>>> inst2 = C()
>>> C.counter
2
Все работает как надо, и, казалось бы, counter - то что нам нужно. Но тут наступает то, что не увязывается с концепцией статического аттрибута. Дело в том, что помимо аттрибута counter класса C, создаются аттрибуты counter экземпляров класса C, для каждого экземпляра в отдельности:
>>> inst1.counter
2
>>> inst2.counter
2
которые изначально ссылаются на тот же объект int, что и аттрибут C.counter:
>>> inst1.counter is C.counter
True
>>> inst2.counter is C.counter
True
Но стоит поработать с аттрибутом counter какого-то экземпляра в отдельности, его связь с аттрибутом counter класса C исчезает, что и понятно:
>>> inst1.counter = 5
>>> C.counter
2
>>> inst1.counter is C.counter
False
Это совсем не та семантика статических аттрибутов данных, которая принята в C++ и в Java. Мне не нужны аттрибуты экземпляра, которые создаются для каждого объявленного в теле класса “статического” аттрибута. Это лишь захламляет память (на каждый аттрибут counter экземлпяров класса C нужно выделять указатель), да и противоречит самому понятию статический аттрибут - он должен быть в единственном экземпляре.
То есть, описанный выше механизм лишь отчасти реализует концепцию статических аттрибутов в Python. Вопрос: есть ли альтернативный механизм, который в точности соответствует принятым понятиям в C++ или Java?
Буду благодарен любым ссылкам, где освещается этот вопрос.