Ответ
Переменная класса в Python — это атрибут, который принадлежит самому классу, а не его отдельным экземплярам. Она является общей для всех объектов этого класса и используется для хранения данных, которые не должны меняться от экземпляра к экземпляру, например, констант или счетчиков.
Создание и доступ:
Переменная объявляется непосредственно в теле класса. Доступ к ней возможен как через имя класса, так и через любой его экземпляр.
class Car:
# Переменная класса, общая для всех машин
wheels = 4
def __init__(self, model):
# Переменная экземпляра
self.model = model
# Доступ через класс
print(f"У класса Car {Car.wheels} колеса.")
# Доступ через экземпляры
bmw = Car("BMW")
audi = Car("Audi")
print(f"У {bmw.model} {bmw.wheels} колеса.")
print(f"У {audi.model} {audi.wheels} колеса.")
Ключевое отличие от переменных экземпляра:
При попытке изменить переменную класса через экземпляр, создается новая переменная экземпляра с тем же именем, которая "затеняет" (shadows) переменную класса. Исходная переменная класса остается неизменной.
# Изменим переменную через экземпляр
bmw.wheels = 5
print(f"У {bmw.model} теперь {bmw.wheels} колес.") # 5
print(f"А у {audi.model} по-прежнему {audi.wheels} колеса.") # 4
print(f"У класса Car все еще {Car.wheels} колеса.") # 4
# Изменение через класс влияет на все экземпляры, у которых нет своей переменной
Car.wheels = 6
print(f"Теперь у {audi.model} {audi.wheels} колес.") # 6
print(f"А у {bmw.model} все еще {bmw.wheels} колес, т.к. у него своя переменная.") # 5 Ответ 18+ 🔞
Ну, смотри, объясняю как есть, на пальцах, а то у тебя там, вижу, уже глаза стеклянные от этих "атрибутов" и "экземпляров". Переменная класса в Питоне — это как общая тарелка с печеньками на всю семью. Все, блядь, из неё берут. А переменная экземпляра — это твоя личная, заныканная под подушкой пачка, чтобы брат-пидорас не сожрал.
Как это выглядит в коде, ёпта:
Объявляется эта общаковая переменная прямо в теле класса, а не в том __init__, где у каждого своя кухня.
class Тачка:
# Вот она, переменная класса. Колёса у всех одинаковые, пока не начнёшь тюнинговать.
колёса = 4
def __init__(self, модель):
# А вот это уже личное имущество каждой конкретной тачки.
self.модель = модель
# Спрашиваем у самого класса: "Слышь, а сколько у тебя колёс-то?"
print(f"У всех тачек класса 'Тачка' по {Тачка.колёса} колеса.")
# Создаём две конкретные железяки
bmw = Тачка("BMW")
жигуль = Тачка("Жигуль")
print(f"У {bmw.модель} {bmw.колёса} колеса.") # Берёт из общей тарелки
print(f"У {жигуль.модель} {жигуль.колёса} колеса.") # Тоже из общей
А теперь, сука, самое важное — где собака порылась:
Если ты через какую-то конкретную тачку попробуешь поменять эти общие колёса, то Питон, хитрая жопа, не полезет в общак. Он тебе на эту конкретную тачку налепит её личные колёса, а общие останутся как были, в рот меня чих-пых!
# Решил наш владелец BMW понтоваться и поставить пятое колесо (ну, мало ли).
bmw.колёса = 5
print(f"У {bmw.модель} теперь {bmw.колёса} колёс.") # 5, его личные
print(f"А у {жигуль.модель} по-прежнему {жигуль.колёса} колеса.") # 4, из общака
print(f"И у самого класса 'Тачка' всё те же {Тачка.колёса} колеса.") # 4, общак нетронут!
# А вот если поменять через САМ КЛАСС — это пиздец, ребята, всеобщая мобилизация!
Тачка.колёса = 6
print(f"Теперь у {жигуль.модель} {жигуль.колёса} колёс.") # 6, подтянул из нового общака!
print(f"А у {bmw.модель} всё ещё {bmw.колёса} колёс, потому что у него своя, ебаная, локальная.") # 5
Вот и вся магия, блядь. Не путай общее с личным, а то получишь неожиданный пиздец в коде. Всё гениальное просто, как три копейки.