Глава 14 · Создаём объекты реального мира
Атрибуты экземпляра и класса
Один атрибут может жить в объекте, а другой — в самом классе, общим на всех. Это не одно и то же.
Два места, где может жить атрибут
До сих пор все атрибуты создавались внутри __init__ через
self.имя = ... — это атрибуты экземпляра, у
каждого объекта свои. Но атрибут можно объявить и прямо в теле класса, без
self — тогда это атрибут класса, один на все
объекты сразу:
atribut_klassa.py
class Sobaka:
vid = "Собака" # атрибут КЛАССА — один на всех
def __init__(self, klichka, vozrast):
self.klichka = klichka # атрибут ЭКЗЕМПЛЯРА — свой у каждого
self.vozrast = vozrast
rex = Sobaka("Рекс", 3)
sharik = Sobaka("Шарик", 5)
print(rex.vid, sharik.vid) # Собака Собака — общий атрибут
Частое заблуждение: «атрибуты класса копируются в каждый объект»
Это не так.
vid хранится ОДИН раз — в самом классе Sobaka. Когда вы пишете rex.vid, Python сначала ищет vid среди атрибутов ЭКЗЕМПЛЯРА rex — не находит — и только затем смотрит на класс Sobaka, где и находит общее значение. Ни один байт vid не копируется в rex.Если присвоить атрибуту с тем же именем значение ЧЕРЕЗ ОБЪЕКТ — Python создаст новый атрибут ЭКЗЕМПЛЯРА, который отныне «затеняет» атрибут класса именно для этого объекта, не трогая остальные:
zatenenie.py
rex.vid = "Дворняга" # создаёт vid у САМОГО rex, не трогая класс
print(rex.vid, sharik.vid) # Дворняга Собака — sharik не изменился
Практика: атрибуты экземпляра и класса
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки