Как в Python создать переменную класса

Ответ

Переменная класса в 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

Вот и вся магия, блядь. Не путай общее с личным, а то получишь неожиданный пиздец в коде. Всё гениальное просто, как три копейки.