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

«В чем разница между переменными класса и переменными экземпляра в Python?» — вопрос из категории ООП, который задают на 10% собеседований 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__ экземпляра
Основное применение Константы, счетчики, общие для всех атрибуты Уникальные свойства и состояние каждого объекта