← Назад к вопросам

Как отличить переменную класса от переменной экземпляра?

1.0 Junior🔥 221 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как отличить переменную класса от переменной экземпляра

В Python есть два типа переменных: переменные класса и переменные экземпляра. Они имеют разные области видимости и время жизни.

Переменная класса

Определяется на уровне класса и принадлежит самому классу. Все экземпляры класса делят одну копию этой переменной:

class Counter:
    count = 0  # Переменная класса
    
    def __init__(self, name):
        Counter.count += 1
        self.name = name

c1 = Counter("первый")
print(Counter.count)  # 1
print(c1.count)       # 1

c2 = Counter("второй")
print(Counter.count)  # 2
print(c1.count)       # 2

Характеристики:

  • Определяется в теле класса, но не в методе
  • Принадлежит классу, не экземпляру
  • Разделяется между всеми экземплярами
  • Изменение через класс видно всем
  • Присутствует в dict класса

Переменная экземпляра

Определяется в методе init или других методах. Каждый экземпляр имеет свою копию:

class Person:
    def __init__(self, name, age):
        self.name = name  # Переменная экземпляра
        self.age = age    # Переменная экземпляра

p1 = Person("Иван", 30)
p2 = Person("Петр", 25)

print(p1.name)  # Иван
print(p2.name)  # Петр

p1.name = "Алексей"
print(p1.name)  # Алексей
print(p2.name)  # Петр (не изменилась)

Характеристики:

  • Определяется в методах (обычно в init)
  • Принадлежит конкретному экземпляру
  • Каждый экземпляр имеет свою копию
  • Изменение в одном экземпляре не влияет на другие
  • Присутствует в dict экземпляра

Проверка через dict

Можно использовать dict для определения, где хранится переменная:

class Demo:
    class_var = "класс"
    
    def __init__(self):
        self.instance_var = "экземпляр"

d = Demo()

print("class_var" in Demo.__dict__)        # True (в классе)
print("instance_var" in Demo.__dict__)     # False (не в классе)
print("instance_var" in d.__dict__)        # True (в экземпляре)
print("class_var" in d.__dict__)           # False (не в экземпляре)

Ловушка: случайное переопределение

class Student:
    grades = []  # Переменная класса (ЛОВУШКА!)
    
    def __init__(self, name):
        self.name = name

s1 = Student("Иван")
s2 = Student("Петр")

s1.grades.append(5)  # Добавляем в список класса!
print(s1.grades)      # [5]
print(s2.grades)      # [5] - ОПА! grades изменилась для обоих!

Правильный способ:

class Student:
    def __init__(self, name):
        self.name = name
        self.grades = []  # Переменная экземпляра

s1 = Student("Иван")
s2 = Student("Петр")

s1.grades.append(5)
print(s1.grades)      # [5]
print(s2.grades)      # [] - правильно, отдельный список

Когда использовать

Переменная класса для:

  • Общих данных, разделяемых всеми экземплярами
  • Счётчиков (количество создано объектов)
  • Констант
  • Конфигурационных параметров

Переменная экземпляра для:

  • Данных, уникальных для каждого объекта
  • Состояния объекта
  • Параметров инициализации
class BankAccount:
    min_balance = 0      # Переменная класса
    commission = 0.01    # Переменная класса
    
    def __init__(self, owner, balance):
        self.owner = owner        # Переменная экземпляра
        self.balance = balance    # Переменная экземпляра
Как отличить переменную класса от переменной экземпляра? | PrepBro