← Назад к вопросам
Как отличить переменную класса от переменной экземпляра?
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 # Переменная экземпляра