---
title: ООП. Классы и методы
seo:
  title: ООП. Классы и методы — Python Developer
  description: 'Тема «ООП. Классы и методы» для собеседования Python Developer. Какие типы классов существуют в Python? Что представляют собой "магические" методы в Python и какие виды магических методов существуют?'
---

[Все темы Python Developer](/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. [Классы в Python](https://metanit.com/python/tutorial/7.1.php)
   :::

---

## <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. [Pythonic способ использования геттеров и сеттеров](https://sky.pro/media/pythonic-sposob-ispolzovaniya-getterov-i-setterov/)
   :::

---

## <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](https://metanit.com/python/tutorial/7.1.php)
   :::

---

## <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://metanit.com/python/tutorial/7.1.php)
   :::

---

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

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

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

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

---

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

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

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

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