Глава 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)   # Собака Собака — общий атрибут
Sobakavid (атрибут класса)klichkavozrast
Атрибут класса объявлен в теле класса; атрибуты экземпляра — внутри __init__
rex : Sobakavid = 'Собака'klichka = 'Рекс'vozrast = 3
rex — vid читается с класса
sharik : Sobakavid = 'Собака'klichka = 'Шарик'vozrast = 5
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, без установки
Открыть практику →