Атрибуты экземпляра класса

Все действия, которые применяются к классу, аналогично применимы и к экземплярам класса (далее ЭК). Основное различие заключается в том, что при работе с ЭК синтаксис изменяется незначительно — вместо имени класса используем переменную, которая ссылается на ЭК.

Например:

instance_name.attribute_name

Где instance_name — это сам экземпляр класса, а attribute_name — имя атрибута, к которому мы обращаемся. Например:

class MyClass:
    attribute = 'значение'

instance = MyClass()
print(instance.attribute)  # Выведет 'значение'

Помните, что атрибуты класса принадлежат самому классу, и при создании ЭК эти атрибуты не копируются в сам экземпляр, а ссылаются на атрибуты класса. Например:

class MyClass:
    name = 'Класс'

instance = MyClass()
print(instance.name)  # Выведет 'Класс'

Однако, если изменить атрибут через ЭК, то это изменение отразится только в самом экземпляре и будет записано в его пространстве имён (словаре атрибутов):

instance.name = 'Экземпляр'
print(instance.name)  # Выведет 'Экземпляр'
print(MyClass.name)   # Выведет 'Класс'

Важно отметить, что изменение атрибута через ЭК не затрагивает атрибут класса, так как изменения производились на уровне экземпляра.


Независимость атрибутов у разных экземпляров

Теперь посмотрим, как ведут себя атрибуты у разных экземпляров класса:

instance2 = MyClass()
print(instance2.name)  # Выведет 'Класс'
instance2.name = 'Другой экземпляр'
print(instance2.name)  # Выведет 'Другой экземпляр'
print(instance.name)   # Выведет 'Экземпляр'

Как видно, атрибуты двух экземпляров работают независимо друг от друга. Любые изменения затрагивают только конкретный экземпляр, к которому мы обратились. В то же время, изменения в атрибутах самого класса будут отражаться на всех экземплярах, которые используют эти атрибуты по умолчанию.

Вот таблица, описывающая работу с атрибутами экземпляров и классов:

ОперацияСинтаксис/ФункцияПримерВывод
Доступ к атрибутам экземпляраinstance_name.attribute_nameinstance.attribute'значение'
Ссылки на атрибуты класса через экземплярАтрибут экземпляра ссылается на атрибут классаinstance.name'Класс'
Изменение атрибута через экземплярСоздаётся атрибут в экземпляреinstance.name = 'Экземпляр'instance.name = 'Экземпляр', MyClass.name = 'Класс'
Независимость атрибутов у разных экземпляровКаждый экземпляр может иметь своё значениеinstance2.name = 'Другой экземпляр'instance.name = 'Экземпляр', instance2.name = 'Другой экземпляр'
Влияние удаления атрибута экземпляраПри удалении атрибута экземпляра используется атрибут классаdel instance.name, print(instance.name)'Класс' (атрибут экземпляра удалён, используется атрибут класса)


Влияние удаления атрибута

Если у экземпляра и класса имеются атрибуты с одинаковыми именами, и атрибут экземпляра был удалён, то при обращении к этому атрибуту будет использовано значение из класса:

del instance.name
print(instance.name)  # Выведет 'Класс', так как атрибут экземпляра удалён

Перейти к следующему шагу

Комментарии