В чем разница между переменными класса и переменными экземпляра в Python?

Ответ

Основное различие заключается в их области видимости и жизненном цикле.

  • Переменная класса (Class Variable): Принадлежит самому классу. Существует в единственном экземпляре и является общей для всех объектов этого класса.
  • Переменная экземпляра (Instance Variable): Принадлежит конкретному объекту (экземпляру) класса. У каждого объекта свой собственный набор таких переменных.

Пример:

class Dog:
    # Переменная класса: общая для всех собак
    species = "Canis familiaris"

    def __init__(self, name):
        # Переменная экземпляра: уникальна для каждой собаки
        self.name = name

# Создаем два экземпляра
dog1 = Dog("Рекс")
dog2 = Dog("Шарик")

# Изменение переменной класса влияет на все экземпляры
print(f"Вид Рекса: {dog1.species}") # Вид Рекса: Canis familiaris
Dog.species = "Домашний волк"
print(f"Новый вид Шарика: {dog2.species}") # Новый вид Шарика: Домашний волк

# Изменение переменной экземпляра затрагивает только один объект
dog1.name = "Гром"
print(f"Новое имя dog1: {dog1.name}") # Новое имя dog1: Гром
print(f"Имя dog2 осталось прежним: {dog2.name}") # Имя dog2 осталось прежним: Шарик

Сводная таблица

Характеристика Переменная класса Переменная экземпляра
Область видимости Общая для всех экземпляров класса Уникальна для каждого экземпляра
Определение В теле класса, вне методов Внутри методов (обычно __init__) через self
Хранение В атрибуте __dict__ класса В атрибуте __dict__ экземпляра
Основное применение Константы, счетчики, общие для всех атрибуты Уникальные свойства и состояние каждого объекта

Ответ 18+ 🔞

А, ну это же классика, блядь! Вечный вопрос, который у новичков мозг в труху превращает. Сейчас разжуём, как есть, без соплей.

Представь себе, что класс — это чертёж завода по производству собак, ёпта. А каждый объект — это конкретная живая псина, сбежавшая с этого завода.

Так вот, переменная класса — это, сука, какая-нибудь глобальная настройка на всём заводе. Типа, "вид: Canis familiaris". Она одна на всех, блядь! Написали на стене в цеху — и все новенькие пёсели с конвейера уже с этой бумажкой в зубах выезжают. Изменил надпись — и все, включая уже выпущенных, становятся "Домашними волками". Общая судьба, мать её!

А переменная экземпляра — это уже личные татухи каждой собаки. Имя, возраст, любимая косточка. Одна псина — Рекс, другая — Шарик. Рексу имя поменяли на "Гром" — так Шарик-то с какого перепугу меняться должен? У него своя жизнь, своя жопка чешется!

Вот смотри на код, тут всё как на ладони, блядь:

class Dog:
    # Это вот она, общаковая, переменная класса. Как вывеска на проходной.
    species = "Canis familiaris"

    def __init__(self, name):
        # А это личное дело каждой собаки. Каждому self. свой name.
        self.name = name

# Штампуем двух ушастых.
dog1 = Dog("Рекс")
dog2 = Dog("Шарик")

# Меняем вывеску на заводе. Всем поголовно!
print(f"Вид Рекса: {dog1.species}") # Вид Рекса: Canis familiaris
Dog.species = "Домашний волк" # Ёбта, переименовали вид!
print(f"Новый вид Шарика: {dog2.species}") # Новый вид Шарика: Домашний волк. Шарик в шоке!

# А тут Рексу кличку сменили. Это его личное горе.
dog1.name = "Гром"
print(f"Новое имя dog1: {dog1.name}") # Новое имя dog1: Гром
print(f"Имя dog2 осталось прежним: {dog2.name}") # Имя dog2 осталось прежним: Шарик. Ему похуй!

Короче, таблица, чтобы вообще ни хуя не осталось непонятного

Признак Переменная класса (Общак) Переменная экземпляра (Личное)
Чей это? Класса. Одна на всех, как общий унитаз. Конкретного объекта. У каждого свой горшок.
Где объявляется? Прямо в теле класса, как приказ сверху. В методах (чаще в __init__), через self.
Где лежит? В тайной комнатке класса (__dict__ класса). В рюкзаке объекта (__dict__ экземпляра).
Зачем нужно? Для констант, счётчиков, общих для всех настроек. Для хранения уникального состояния каждой твари.

Вот и вся магия, блядь. Не усложняй. Общак — для всех. Личное — для себя. Главное — не перепутать, а то получится пиздец, когда у всех объектов вдруг одна жопа на всех окажется.