---
title: ООП. Классы и методы
questionDates:
  q-transfer-0161: '2026-10-01'
  q-transfer-0162: '2026-10-01'
  q-transfer-0163: '2026-10-01'
  q-transfer-0243: '2026-10-01'
  q-transfer-0244: '2026-10-01'
  q-transfer-0245: '2026-10-01'
  q-transfer-0246: '2026-10-01'
  q-transfer-0247: '2026-10-01'
  q-transfer-0248: '2026-10-01'
  q-transfer-0249: '2026-10-01'
  q-transfer-0275: '2026-10-01'
  q-transfer-0276: '2026-10-01'
seo:
  description: >-
    Тема «ООП. Классы и методы» для собеседования Python Developer. Какие типы
    классов существуют в Python? Что представляют собой "магические" методы в
    Python и какие виды магических методов существуют?
  title: ООП. Классы и методы — Python Developer
---

[Все темы Python Developer](/prep/python-developer)

## <strong>Какие типы классов существуют в Python?</strong> [#q-14bee738d69b81e69b1de56be542d202]

В Python 3 все классы наследуют object прямо или косвенно. Классы старого стиля относятся только к Python 2; метаклассы выполняют отдельную роль, создавая классы.

#### <strong>Новые стили классов (New-style classes)</strong>&#58;

- Это классы, которые являются наследниками встроенного класса <code>object</code>.

- В Python 3.x все классы автоматически являются новыми стилями.

#### <strong>Старые стили классов (Old-style classes)</strong>&#58;

- Это классы, которые не являются наследниками класса <code>object</code>.

- В Python 2.x классы старого стиля создавались без явного указания наследования от <code>object</code>.

#### <strong>Метаклассы (Metaclasses)</strong>&#58;

- Это классы, экземпляры которых являются классами.

- Они используются для управления созданием классов и их поведением.

- Метаклассы часто используются для магического манипулирования атрибутами и методами классов.

В Python 3 классов старого стиля нет. Метаклассом по умолчанию служит type.

:::note[Ссылки для изучения]

1. [Класс, экземпляр и метакласс: type и наследование object в Python — вводный разбор](https://habr.com/ru/companies/piter/articles/592127/)
   :::

---

## <strong>Что представляют собой "магические" методы в Python и какие виды магических методов существуют?</strong> [#q-14bee738d69b81178c42f9cf456a5b11]

"Магические" методы в Python представляют собой специальные методы с двойными подчеркиваниями в начале и в конце своего имени. Они позволяют определить поведение объектов в различных ситуациях, таких как итерация, вызов функций, доступ к атрибутам и т. д. Некоторые из наиболее часто используемых магических методов включают <code>\_\_init\_\_</code> для инициализации объекта, <code>\_\_str\_\_</code> для представления объекта в виде строки, <code>\_\_len\_\_</code> для определения длины объекта и многие другие.

:::note[Ссылки для изучения]

1. [Магические методы в Python](https://habr.com/ru/articles/788248/)
   :::

---

## <strong>В чем разница между методами</strong> <code>\_\_init\_\_&#40;&#41;</code> <strong>и</strong> <code>\_\_str\_\_&#40;&#41;</code><strong>?</strong> [#q-14bee738d69b8153b369d3f00f36bc21]

Метод <code>\_\_init\_\_&#40;&#41;</code> используется для инициализации нового объекта в классе. Он вызывается автоматически при создании экземпляра класса и используется для инициализации атрибутов объекта.

Метод <code>\_\_str\_\_&#40;&#41;</code> используется для представления объекта в виде строки. Он вызывается при использовании функции <code>str&#40;&#41;</code> или при преобразовании объекта в строку, например, при вызове <code>print&#40;&#41;</code>.

:::note[Ссылки для изучения]

1. [Магические методы в Python](https://habr.com/ru/articles/788248/)
   :::

---

## <strong>Что представляют собой геттеры и сеттеры?</strong> [#q-14bee738d69b8136b231ea2625d7562c]

Геттеры и сеттеры - это методы, используемые для доступа к атрибутам объекта.

#### <strong>Геттеры</strong> <code>&#40;getters&#41;</code>&#58;

- Геттеры позволяют получать значение атрибута объекта.

- Они обычно используются для получения значения приватных атрибутов.

- Геттеры обеспечивают контролируемый доступ к данным объекта.

#### <strong>Сеттеры</strong> <code>&#40;setters&#41;</code>&#58;

- Сеттеры позволяют устанавливать значение атрибута объекта.

- Они используются для установки значения атрибута с дополнительной проверкой или обработкой.

- Сеттеры обеспечивают контролируемое изменение данных объекта.

Использование геттеров и сеттеров помогает обеспечить инкапсуляцию данных и контролировать доступ к ним в объектно-ориентированном программировании.

:::note[Ссылки для изучения]

1. [Getter, setter и управляемый атрибут через property — документация Python](https://docs.python.org/ru/3.14/builtins/functions.html#property)
2. [Геттеры и сеттеры. Python Russian, с 2:13](https://www.youtube.com/watch?v=Ak8Fqw7YpDc&t=133s)

:::

---

## <strong>Как сделать неизменяемый класс в Python?</strong> [#q-14bee738d69b8130a426d3a1120c4ef1]

<strong>Чтобы создать неизменяемый класс в Python, следует&#58;</strong>

1. Определить класс с помощью ключевого слова <code>class</code>.

1. Использовать неизменяемые значения полей. Двойное подчёркивание меняет имя атрибута, но не запрещает его изменение.

1. Создать методы только для чтения атрибутов класса (без методов для изменения значений).

1. Переопределить методы <code>\_\_setattr\_\_&#40;&#41;</code> и <code>\_\_delattr\_\_&#40;&#41;</code>, чтобы они возбуждали исключение <code>AttributeError</code>, предотвращая изменение атрибутов класса.

1. По желанию, переопределить метод <code>\_\_hash\_\_&#40;&#41;</code>, если класс будет использоваться в качестве ключа в словарях или множествах.

<strong>Пример&#58;</strong>

```python
class ImmutableClass:
    def __init__(self, value):
        object.__setattr__(self, "_ImmutableClass__value", value)

    @property
    def value(self):
        return self.__value

    def __setattr__(self, name, value):
        raise AttributeError("ImmutableClass object does not support attribute assignment")

    def __delattr__(self, name):
        raise AttributeError("ImmutableClass object does not support attribute deletion")

    def __hash__(self):
        return hash(self.__value)
```

:::note[Ссылки для изучения]

1. [Замороженные экземпляры Python: `frozen=True`, `__setattr__` и `__delattr__` — документация dataclasses](https://pythondoc.ru/docs/python/3.10/library/dataclasses/#frozen-instances)
   :::

---

## <strong>Что считается объектом в ООП?</strong> [#q-14bee738d69b81c2a6a4c6c3513fe469]

В объектно-ориентированном программировании <code>&#40;ООП&#41;</code>, объект представляет собой экземпляр класса. Он содержит данные <code>&#40;атрибуты&#41;</code> и методы, которые оперируют этими данными. Объекты могут взаимодействовать друг с другом, отправляя сообщения <code>&#40;вызывая методы&#41;</code> и обмениваясь данными. Класс определяет структуру <code>&#40;атрибуты&#41;</code> и поведение <code>&#40;методы&#41;</code> объектов, а объекты являются конкретными экземплярами класса, обладающими конкретными значениями данных.

:::note[Ссылки для изучения]

1. [Классы в Python](https://metanit.com/python/tutorial/7.1.php)
   :::

---

## <strong>Является ли функция объектом в Python?</strong> [#q-14bee738d69b8139bf00d9b794c147dd]

Да, в Python функция является объектом первого класса, что означает, что она может быть присвоена переменной, передана как аргумент в функцию, возвращена из другой функции и т. д. Функции в Python могут быть созданы и использованы так же, как и любые другие объекты данных.

:::note[Ссылки для изучения]

1. [Объект пользовательской функции и его атрибуты — русская модель данных Python](https://pythondoc.ru/docs/python/3.10/reference/datamodel/#user-defined-functions)
   :::

---

## <strong>Какой класс может создавать другие классы в Python?</strong> [#q-14bee738d69b81eaa2bcf62169496c90]

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

:::note[Ссылки для изучения]

1. [Метакласс type и собственный Meta(type): как в Python создаются классы](https://habr.com/ru/companies/piter/articles/592127/)
   :::

---

## <strong>Какой самый первый метакласс в Python?</strong> [#q-14bee738d69b814e98bed039e2d46ba4]

В Python самый первый метакласс, который управляет созданием всех классов по умолчанию, называется <code>type</code>. Когда вы определяете новый класс в Python, интерпретатор автоматически использует метакласс <code>type</code> для создания этого класса.

:::note[Ссылки для изучения]

1. [Почему type является метаклассом по умолчанию — отношения type и object в Python](https://habr.com/ru/companies/piter/articles/592127/)
   :::

---

## Как MRO определяет поиск методов в Python? [#q-transfer-0161]

MRO задает линейный порядок, в котором класс и его базовые классы ищут атрибуты. Python строит его алгоритмом C3, сохраняя локальный порядок родителей и согласованность иерархии; несовместимая схема классов не создастся. Порядок виден в `Cls.__mro__` или `Cls.mro()`. `super()` обращается к следующему классу именно в MRO, поэтому кооперативные методы должны принимать совместимые аргументы и вызывать `super()`. Механизм применяют ради ясного контракта объекта, а не как способ скрыть обычную функцию или простые данные.

:::note[Ссылки для изучения]

1. [MRO и C3-линеаризация: порядок поиска методов и super — конспект курса Python на ВМК](https://www.uneex.ru/LecturesCMC/PythonIntro2024/09_InheritanceExceptions)
   :::

---

## Когда использовать dataclass вместо обычного класса? [#q-transfer-0162]

`dataclass` подходит классу, который в основном хранит типизированные поля: он генерирует `__init__`, `__repr__`, сравнение и другие методы по параметрам. Для изменяемого значения по умолчанию используют `field(default_factory=...)`. `frozen=True` запрещает обычное присваивание, но не превращает вложенные объекты в глубоко неизменяемые. При сложных инвариантах и богатом поведении явный класс часто читается лучше, хотя `__post_init__` может выполнять локальную проверку. Механизм применяют ради ясного контракта объекта, а не как способ скрыть обычную функцию или простые данные.

:::note[Ссылки для изучения]

1. [Dataclass для хранения полей: автоматические методы и default_factory — selfedu](https://proproprogs.ru/python_oop/python-oop-vvedenie-v-python-data-classes-chast-1)
   :::

---

## Что меняет `__slots__` в Python-классе? [#q-transfer-0163]

`__slots__` объявляет допустимые атрибуты и обычно убирает отдельный `__dict__` у каждого экземпляра, экономя память при большом числе объектов. Динамически добавить произвольное поле тогда нельзя. Для слабых ссылок нужен слот `__weakref__`; наследование требует аккуратно объявлять слоты на каждом уровне. Это оптимизация представления экземпляров, а не механизм приватности, и выгоду следует измерять на реальной модели. Механизм применяют ради ясного контракта объекта, а не как способ скрыть обычную функцию или простые данные.

:::note[Ссылки для изучения]

1. [`__slots__`: допустимые поля экземпляра и отсутствие `__dict__` — selfedu](https://proproprogs.ru/python_oop/python-kollekciya-slots)
2. [Как **slots** меняет экземпляры класса. Python Russian, с 34:51](https://www.youtube.com/watch?v=Ak8Fqw7YpDc&t=2091s)

:::

---

## Чем `__new__` отличается от `__init__`? [#q-transfer-0243]

`__new__` создает и возвращает экземпляр, получая класс первым аргументом. Если он вернул экземпляр этого класса, Python затем вызывает `__init__`, который настраивает уже созданный объект и должен вернуть `None`. `__new__` переопределяют для immutable-типов, кэширования или контроля создания. Если он вернул объект другого типа, `__init__` исходного класса обычно не вызывается. Механизм применяют ради ясного контракта объекта, а не как способ скрыть обычную функцию или простые данные.

:::note[Ссылки для изучения]

1. [Создание объекта через `__new__` и инициализация через `__init__` — документация Python](https://docs.python.org/ru/3/reference/datamodel.html#object.__new__)
   :::

---

## Когда применять @property? [#q-transfer-0244]

`@property` сохраняет интерфейс обычного атрибута, добавляя вычисление, проверку или управляемую запись. Getter должен оставаться недорогим и не удивлять заметным I/O. Setter полезен для локального инварианта, но сложную бизнес-операцию лучше назвать методом. Property позволяет позже изменить внутреннее хранение без смены вызовов, однако не превращает публичный атрибут в настоящую защиту от доступа. Механизм применяют ради ясного контракта объекта, а не как способ скрыть обычную функцию или простые данные.

:::note[Ссылки для изучения]

1. [Управляемый атрибут через @property, getter и setter — документация Python](https://docs.python.org/ru/3.14/builtins/functions.html#property)
2. [Когда использовать @property. Python Russian, с 21:12](https://www.youtube.com/watch?v=Ak8Fqw7YpDc&t=1272s)

:::

---

## Как property использует протокол дескрипторов? [#q-transfer-0245]

`property` является дескриптором: при доступе Python вызывает его `__get__`, при присваивании `__set__`, при удалении `__delete__`, если соответствующие функции заданы. Само значение обычно хранят под другим именем, например `_price`; запись `self.price` внутри setter снова вызовет setter и приведет к рекурсии. Data descriptor имеет приоритет над одноименным значением в `__dict__` экземпляра. Механизм применяют ради ясного контракта объекта, а не как способ скрыть обычную функцию или простые данные.

:::note[Ссылки для изучения]

1. [Property как дескриптор данных: протокол и приоритет поиска атрибутов — Рэймонд Хеттингер](https://pythondoc.ru/docs/python/3.10/howto/descriptor/#properties)
   :::

---

## Как задать абстрактный класс через abc? [#q-transfer-0246]

Класс наследуют от `abc.ABC`, а обязательные методы или свойства помечают `@abstractmethod`. Пока абстрактные члены не реализованы, экземпляр подкласса создать нельзя. ABC может содержать готовые методы и даже реализацию абстрактного метода для кооперативного вызова. Механизм задает номинальный контракт времени выполнения; для структурного статического контракта без наследования подходит `typing.Protocol`. Механизм применяют ради ясного контракта объекта, а не как способ скрыть обычную функцию или простые данные.

:::note[Ссылки для изучения]

1. [Абстрактный класс ABC и обязательные методы через abstractmethod — METANIT](https://metanit.com/python/tutorial/7.8.php)
   :::

---

## Как согласовать `__eq__` и `__hash__`? [#q-transfer-0247]

Если `a == b`, их хеши обязаны совпадать. Поэтому хеш вычисляют только из тех же стабильных полей, что участвуют в равенстве; изменяемый объект с value equality обычно делают нехешируемым. При неизвестном типе `__eq__` возвращает `NotImplemented`, чтобы Python попробовал обратную операцию. Определение `__eq__` обычно отключает унаследованный `__hash__`, если разработчик явно не задал корректный вариант. Механизм применяют ради ясного контракта объекта, а не как способ скрыть обычную функцию или простые данные.

:::note[Ссылки для изучения]

1. [Контракт равенства и хеша: согласование `__eq__` и `__hash__` — документация Python](https://pythondoc.ru/docs/python/3.10/reference/datamodel/#object.__hash__)
   :::

---

## Что означают `_` и `__` в именах Python? [#q-transfer-0248]

Один ведущий `_name` означает внутреннюю деталь по соглашению и влияет на `from module import *`, но не запрещает доступ. Два ведущих подчеркивания в классе запускают name mangling, например `__x` превращается в `_Class__x`, чтобы уменьшить случайные конфликты в наследниках. Имена вида `__len__` зарезервированы для специальных протоколов; собственные dunder-имена придумывать не следует. Механизм применяют ради ясного контракта объекта, а не как способ скрыть обычную функцию или простые данные.

:::note[Ссылки для изучения]

1. [Внутренние имена с подчёркиванием и name mangling в классах — документация Python](https://docs.python.org/ru/3/tutorial/classes.html#private-variables)
   :::

---

## Почему альтернативный конструктор возвращает `cls(...)`? [#q-transfer-0249]

`@classmethod` получает фактический класс в `cls`. Альтернативный конструктор разбирает другую форму входа и возвращает `cls(...)`, поэтому вызов через наследника создает наследника, если его конструктор совместим. Жестко записанное имя базового класса ломает этот полиморфизм. Если фабрика может вернуть разные несвязанные типы или делает сложный I/O, отдельная функция или сервис обычно выражает намерение яснее. Механизм применяют ради ясного контракта объекта, а не как способ скрыть обычную функцию или простые данные.

:::note[Ссылки для изучения]

1. [Как classmethod передаёт фактический класс в cls при наследовании — документация Python](https://docs.python.org/ru/3.14/builtins/functions.html#classmethod)
   :::

---

## Что делает декоратор класса? [#q-transfer-0275]

Декоратор класса вызывается сразу после создания тела класса во время выполнения определения. Он получает класс и возвращает тот же либо другой объект, который связывается с именем. Так регистрируют классы, добавляют методы или превращают их через `dataclass`. Это отличается от декоратора метода, который оборачивает отдельную функцию до создания класса. Замена класса должна сохранять ожидаемую идентичность и метаданные. Механизм применяют ради ясного контракта объекта, а не как способ скрыть обычную функцию или простые данные.

:::note[Ссылки для изучения]

1. [Декоратор класса: регистрация созданных классов в реестре — Advanced Python для сетевых инженеров](https://advpyneng.readthedocs.io/ru/latest/book/08_decorators/class_decorator.html)
   :::

---

## Как связаны type и object? [#q-transfer-0276]

Большинство классов являются экземплярами метакласса `type`, а большинство пользовательских классов наследуют базовый класс `object`. Поэтому `isinstance(C, type)` и `issubclass(C, object)` обычно истинны; сам `type` тоже наследует `object`, а `object` создан метаклассом `type`. `isinstance(x, C)` проверяет принадлежность экземпляра, `issubclass(A, B)` отношение классов. Пользовательские метаклассы должны быть совместимы с метаклассами базовых классов. Механизм применяют ради ясного контракта объекта, а не как способ скрыть обычную функцию или простые данные.

:::note[Ссылки для изучения]

1. [Класс, экземпляр и метакласс: отношения type и object — вводный раздел Джерри](https://habr.com/ru/companies/piter/articles/592127/)
   :::
