Как Python определяет порядок разрешения методов (MRO) в множественном наследовании?
Anonymous Quiz
49%
Используя глубину первого поиска слева направо.
7%
Следуя принципу последнего использования.
19%
Приоритет дается классам, объявленным последними.
24%
Используя алгоритм C3 линеаризации.
В чем основные принципы инкапсуляции ?
Спросят с вероятностью 3%
Инкапсуляция является одним из основных принципов объектно-ориентированного программирования (ООП). Она подразумевает объединение данных и методов, работающих с этими данными, в единый объект, а также скрытие внутренней реализации этого объекта от внешнего мира. Это достигается с помощью контроля доступа к атрибутам и методам класса. Основные принципы инкапсуляции включают:
1️⃣Сокрытие данных
Заключается в ограничении прямого доступа к атрибутам объекта. Это достигается с помощью модификаторов доступа, таких как публичные, защищенные и приватные атрибуты.
Пример:
Публичные атрибуты: Доступны отовсюду.
2️⃣Контроль доступа к данным
Осуществляется с помощью геттеров и сеттеров (методы для получения и изменения значений атрибутов). Это позволяет добавить логику в методы доступа, например, проверку корректности значений.
Пример:
3️⃣Изоляция внутренней реализации
Позволяет изолировать внутреннюю реализацию объекта от внешнего мира. Внешний код использует только публичные методы для взаимодействия с объектом, не зная о деталях его внутренней структуры.
Пример:
4️⃣Повышение надежности и упрощение сопровождения кода
Внутренние детали реализации могут быть изменены без влияния на внешний код. Это делает код более надежным и легким в сопровождении.
Пример:
Изменение внутренней реализации:
Инкапсуляция объединяет данные и методы в объекте, скрывая внутреннюю реализацию и предоставляя публичный интерфейс для взаимодействия. Это улучшает надежность, безопасность и сопровождение кода.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 3%
Инкапсуляция является одним из основных принципов объектно-ориентированного программирования (ООП). Она подразумевает объединение данных и методов, работающих с этими данными, в единый объект, а также скрытие внутренней реализации этого объекта от внешнего мира. Это достигается с помощью контроля доступа к атрибутам и методам класса. Основные принципы инкапсуляции включают:
1️⃣Сокрытие данных
Заключается в ограничении прямого доступа к атрибутам объекта. Это достигается с помощью модификаторов доступа, таких как публичные, защищенные и приватные атрибуты.
Пример:
Публичные атрибуты: Доступны отовсюду.
class MyClass:
def __init__(self):
self.public_attribute = "Public"
2️⃣Контроль доступа к данным
Осуществляется с помощью геттеров и сеттеров (методы для получения и изменения значений атрибутов). Это позволяет добавить логику в методы доступа, например, проверку корректности значений.
Пример:
class MyClass:
def __init__(self):
self.__private_attribute = "Initial Value"
def get_private_attribute(self):
return self.__private_attribute
def set_private_attribute(self, value):
if isinstance(value, str):
self.__private_attribute = value
else:
raise ValueError("Value must be a string")
obj = MyClass()
print(obj.get_private_attribute()) # Вывод: Initial Value
obj.set_private_attribute("New Value")
print(obj.get_private_attribute()) # Вывод: New Value
3️⃣Изоляция внутренней реализации
Позволяет изолировать внутреннюю реализацию объекта от внешнего мира. Внешний код использует только публичные методы для взаимодействия с объектом, не зная о деталях его внутренней структуры.
Пример:
class BankAccount:
def __init__(self, balance):
self.__balance = balance
def deposit(self, amount):
if amount > 0:
self.__balance += amount
else:
raise ValueError("Deposit amount must be positive")
def withdraw(self, amount):
if 0 < amount <= self.__balance:
self.__balance -= amount
else:
raise ValueError("Invalid withdraw amount")
def get_balance(self):
return self.__balance
account = BankAccount(1000)
account.deposit(500)
print(account.get_balance()) # Вывод: 1500
account.withdraw(200)
print(account.get_balance()) # Вывод: 1300
4️⃣Повышение надежности и упрощение сопровождения кода
Внутренние детали реализации могут быть изменены без влияния на внешний код. Это делает код более надежным и легким в сопровождении.
Пример:
Изменение внутренней реализации:
class BankAccount:
def __init__(self, balance):
self.__balance = balance
def deposit(self, amount):
if amount > 0:
self.__balance += amount
else:
raise ValueError("Deposit amount must be positive")
def withdraw(self, amount):
if 0 < amount <= self.__balance:
self.__balance -= amount
else:
raise ValueError("Invalid withdraw amount")
def get_balance(self):
return self.__balance
# Внешний код не изменяется
account = BankAccount(1000)
account.deposit(500)
print(account.get_balance()) # Вывод: 1500
account.withdraw(200)
print(account.get_balance()) # Вывод: 1300
Инкапсуляция объединяет данные и методы в объекте, скрывая внутреннюю реализацию и предоставляя публичный интерфейс для взаимодействия. Это улучшает надежность, безопасность и сопровождение кода.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Как декоратор Middleware в Python обычно используется в веб-фреймворках?
Anonymous Quiz
44%
Для управления потоком данных между клиентом и сервером.
40%
Для валидации данных запроса перед передачей контроллеру.
9%
Для сериализации ответов сервера в JSON.
7%
Для кэширования страниц на стороне сервера.
Как связаны new и singleton ?
Спросят с вероятностью 3%
Методы
Мечасто используется для реализации Singleton в Python. Singleton — это паттерн проектирования, который гарантирует, что у класса будет только один экземпляр на протяжении всего жизненного цикла приложения. Метод new отвечает за создание нового экземпляра класса, и именно его можно использовать для контроля создания объектов.
Метод new — это специальный метод, который вызывается перед методом init. Он отвечает за создание и возвращение нового экземпляра класса. В отличие от метода init, который инициализирует уже существующий объект, new создаёт новый объект класса.
Пример использования new в Singleton
Для реализации паттерна Singleton с использованием метода new нужно сделать так, чтобы метод new возвращал один и тот же экземпляр класса при каждом вызове.
Пример кода:
Пошаговое объяснение:
1️⃣Статический атрибут _instance: Используется для хранения единственного экземпляра класса.
✅Проверяет, существует ли уже экземпляр класса (cls._instance is None).
✅Если не существует, создаёт новый экземпляр с помощью super(Singleton, cls).new(cls, args, kwargs) и сохраняет его в cls._instance.
✅Возвращает экземпляр класса, хранящийся в cls._instance.
3️⃣Метод init:
✅Инициализирует экземпляр только один раз. Проверка if not hasattr(self, '_initialized') предотвращает повторную инициализацию объекта.
Почему Singleton и new связаны
✅Контроль создания объектов: Метод new позволяет контролировать процесс создания объекта, что идеально подходит для реализации Singleton.
✅Единственность экземпляра: С помощью new можно гарантировать, что будет создан только один экземпляр класса, поскольку new может возвращать уже существующий экземпляр.
✅Разделение обязанностей: Метод new отвечает за создание (или возврат существующего) экземпляра, а метод init — за его инициализацию, если это необходимо.
Метод new используется для создания новых экземпляров класса и идеально подходит для реализации паттерна Singleton, так как позволяет контролировать создание единственного экземпляра класса и возвращать его при каждом вызове.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 3%
Методы
__new__
и паттерн Singleton тесно связаны, поскольку методью 3%Мечасто используется для реализации Singleton в Python. Singleton — это паттерн проектирования, который гарантирует, что у класса будет только один экземпляр на протяжении всего жизненного цикла приложения. Метод new отвечает за создание нового экземпляра класса, и именно его можно использовать для контроля создания объектов.
Метод new — это специальный метод, который вызывается перед методом init. Он отвечает за создание и возвращение нового экземпляра класса. В отличие от метода init, который инициализирует уже существующий объект, new создаёт новый объект класса.
Пример использования new в Singleton
Для реализации паттерна Singleton с использованием метода new нужно сделать так, чтобы метод new возвращал один и тот же экземпляр класса при каждом вызове.
Пример кода:
class Singleton:
_instance = None
def __new__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
def __init__(self, value):
if not hasattr(self, '_initialized'): # Проверка на инициализацию
self.value = value
self._initialized = True
# Проверка работы Singleton
singleton1 = Singleton("First Instance")
print(singleton1.value) # Вывод: First Instance
singleton2 = Singleton("Second Instance")
print(singleton2.value) # Вывод: First Instance
print(singleton1 is singleton2) # Вывод: True
Пошаговое объяснение:
1️⃣Статический атрибут _instance: Используется для хранения единственного экземпляра класса.
2️⃣
Метод
eton1 = Sin
✅Проверяет, существует ли уже экземпляр класса (cls._instance is None).
✅Если не существует, создаёт новый экземпляр с помощью super(Singleton, cls).new(cls, args, kwargs) и сохраняет его в cls._instance.
✅Возвращает экземпляр класса, хранящийся в cls._instance.
3️⃣Метод init:
✅Инициализирует экземпляр только один раз. Проверка if not hasattr(self, '_initialized') предотвращает повторную инициализацию объекта.
Почему Singleton и new связаны
✅Контроль создания объектов: Метод new позволяет контролировать процесс создания объекта, что идеально подходит для реализации Singleton.
✅Единственность экземпляра: С помощью new можно гарантировать, что будет создан только один экземпляр класса, поскольку new может возвращать уже существующий экземпляр.
✅Разделение обязанностей: Метод new отвечает за создание (или возврат существующего) экземпляра, а метод init — за его инициализацию, если это необходимо.
Метод new используется для создания новых экземпляров класса и идеально подходит для реализации паттерна Singleton, так как позволяет контролировать создание единственного экземпляра класса и возвращать его при каждом вызове.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Какой механизм наилучше соответствует принципу инкапсуляции для скрытия данных класса?
Anonymous Quiz
8%
Использование модулей для разделения классов
3%
Определение всех методов как статических
40%
Передача всех переменных только через геттеры и сеттеры
49%
Префикс переменных класса с двумя подчеркиваниями для обозначения приватности
Как бы реализовал паттерн singleton ?
Спросят с вероятностью 3%
Паттерн Singleton используется для того, чтобы создать класс, который имеет только один экземпляр. Это полезно, когда нужно ограничить количество объектов, например, для управления ресурсами (как подключение к базе данных) или для хранения глобального состояния.
Существует несколько способов реализовать Singleton. Рассмотрим один из наиболее распространенных способов - использование приватного конструктора и класса-метода для получения экземпляра.
Объяснение кода
1️⃣Приватный атрибут _instance
✅Этот атрибут используется для хранения единственного экземпляра класса.
2️⃣Метод __new__:
✅
✅Если экземпляр ещё не был создан,
3️⃣Метод init:
✅Методреализовалвызывается каждый раз при создании экземпляра. Чтобы избежать повторной инициализации, проверяем наличие атрибута
Можно также реализовать Singleton с помощью декоратора:
Объяснение
1️⃣Декоратор singleton:
✅Хранит экземпляры класса в словаре
✅Если экземпляра класса ещё нет в словаре, он создаётся и добавляется в словарь.
✅Возвращается существующий или новый экземпляр класса.
Паттерн Singleton гарантирует, что класс имеет только один экземпляр. Это достигается контролем создания экземпляров через методые
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 3%
Паттерн Singleton используется для того, чтобы создать класс, который имеет только один экземпляр. Это полезно, когда нужно ограничить количество объектов, например, для управления ресурсами (как подключение к базе данных) или для хранения глобального состояния.
Существует несколько способов реализовать Singleton. Рассмотрим один из наиболее распространенных способов - использование приватного конструктора и класса-метода для получения экземпляра.
class Singleton:
__instance = None
def __new__(cls, args, kwargs):
if cls.__instance is None:
cls.__instance = super(Singleton, cls).__new__(cls, args, kwargs)
return cls.__instance
def __init__(self):
if not hasattr(self, 'initialized'):
self.initialized = True
# Инициализация объекта, если нужно
self.value = 0
# Проверка работы
singleton1 = Singleton()
singleton2 = Singleton()
print(singleton1 is singleton2) # Выведет: True
print(singleton1.value) # Выведет: 0
singleton1.value = 42
print(singleton2.value) # Выведет: 42
Объяснение кода
1️⃣Приватный атрибут _instance
_
:✅Этот атрибут используется для хранения единственного экземпляра класса.
2️⃣Метод __new__:
✅
__new__
- это метод, который создаёт новый экземпляр класса. Если экземпляр уже существует (cls.__instance
не None
), возвращается существующий экземпляр.✅Если экземпляр ещё не был создан,
super(Singleton, cls).__new__(cls, args, kwargs)
создаёт новый экземпляр и сохраняет его в cls.__instance
.3️⃣Метод init:
✅Методреализовалвызывается каждый раз при создании экземпляра. Чтобы избежать повторной инициализации, проверяем наличие атрибута
initialized
.Можно также реализовать Singleton с помощью декоратора:
def singleton(cls):
instances = {}
def get_instance(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return get_instance
@singleton
class SingletonClass:
def __init__(self):
self.value = 0
# Проверка работы
singleton1 = SingletonClass()
singleton2 = SingletonClass()
print(singleton1 is singleton2) # Выведет: True
print(singleton1.value) # Выведет: 0
singleton1.value = 42
print(singleton2.value) # Выведет: 42
Объяснение
1️⃣Декоратор singleton:
✅Хранит экземпляры класса в словаре
instances
.✅Если экземпляра класса ещё нет в словаре, он создаётся и добавляется в словарь.
✅Возвращается существующий или новый экземпляр класса.
Паттерн Singleton гарантирует, что класс имеет только один экземпляр. Это достигается контролем создания экземпляров через методые
None
), или декоратор. Singleton полезен для управления ресурсами и глобального состояния.👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Какое максимально допустимое количество символов рекомендует PEP8 использовать в строке кода?
Anonymous Quiz
51%
79 символов
31%
120 символов
7%
100 символов
11%
90 символов
На что влияет атрибут slots ?
Спросят с вероятностью 3%
Атрибут __slots__ используется для ограничения атрибутов, которые можно добавлять экземплярам класса, и для оптимизации использования памяти. Это особенно полезно в сценариях, где создаётся много объектов одного класса.
Как он работает
По умолчанию, Python использует словарь (
Когда вы определяете атрибут slots в классе, вы тем самым ограничиваете класс набором конкретных атрибутов. Это убирает необходимость в словаре для хранения атрибутов и может значительно сократить использование памяти.
Пример использования
Объяснение
1️⃣Ограничение атрибутов:
✅В классе
✅ В классе
2️⃣Использование памяти:
✅Экземпляры класса состью 3%
Азанимают меньше памяти, так как для хранения атрибутов не используется словарь.
✅Это может существенно уменьшить использование памяти в случаях, когда создаётся много экземпляров класса.
Преимущества:
✅Снижение использования памяти: Экономия памяти за счёт отказа от словарей для хранения атрибутов.
✅Ускорение доступа к атрибутам: Быстрый доступ к атрибутам благодаря фиксированному набору атрибутов.
Недостатки:
✅Ограничение гибкости: Невозможно добавлять новые атрибуты, не указанные в
✅Наследование: Классы-наследники должны явно указывать slots, чтобы сохранить оптимизацию.
Атрибут slots ограничивает набор атрибутов экземпляров класса и уменьшает использование памяти за счёт отказа от словарей для хранения атрибутов. Это повышает эффективность, но уменьшает гибкость.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 3%
Атрибут __slots__ используется для ограничения атрибутов, которые можно добавлять экземплярам класса, и для оптимизации использования памяти. Это особенно полезно в сценариях, где создаётся много объектов одного класса.
Как он работает
По умолчанию, Python использует словарь (
__dict__
) для хранения атрибутов экземпляров. Это даёт большую гибкость, но также приводит к значительному расходу памяти.Когда вы определяете атрибут slots в классе, вы тем самым ограничиваете класс набором конкретных атрибутов. Это убирает необходимость в словаре для хранения атрибутов и может значительно сократить использование памяти.
Пример использования
class RegularClass:
def __init__(self, x, y):
self.x = x
self.y = y
class SlotsClass:
_(self, x, = ['x', 'y']
def __init__(self, x, y):
self.x = x
self.y = y
# Создадим экземпляры классов
regular_instance = RegularClass(1, 2)
slots_instance = SlotsClass(1, 2)
# Попробуем добавить новый атрибут
regular_instance.z = 3 # Это работает
# slots_instance.z = 3 # Это вызовет ошибку AttributeError
print(regular_instance.__dict__) # {'x': 1, 'y': 2, 'z': 3}
# print(slots_instance.__dict__) # AttributeError: 'SlotsClass' object has no attribute '__dict__'
# Проверим использование памяти
import sys
print(sys.getsizeof(regular_instance)) # Выведет размер в байтах
print(sys.getsizeof(slots_instance)) # Выведет размер в байтах, который будет меньше
Объяснение
1️⃣Ограничение атрибутов:
✅В классе
RegularClass
можно добавлять любые атрибуты, так как используется словарь (__dict__
).✅ В классе
SlotsClass
можно добавлять только атрибуты, указанные в= x
2️⃣Использование памяти:
✅Экземпляры класса состью 3%
Азанимают меньше памяти, так как для хранения атрибутов не используется словарь.
✅Это может существенно уменьшить использование памяти в случаях, когда создаётся много экземпляров класса.
Преимущества:
✅Снижение использования памяти: Экономия памяти за счёт отказа от словарей для хранения атрибутов.
✅Ускорение доступа к атрибутам: Быстрый доступ к атрибутам благодаря фиксированному набору атрибутов.
Недостатки:
✅Ограничение гибкости: Невозможно добавлять новые атрибуты, не указанные в
_slots__
в ✅Наследование: Классы-наследники должны явно указывать slots, чтобы сохранить оптимизацию.
Атрибут slots ограничивает набор атрибутов экземпляров класса и уменьшает использование памяти за счёт отказа от словарей для хранения атрибутов. Это повышает эффективность, но уменьшает гибкость.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Какая транзакция в SQL не соответствует принципу Durability в ACID, если система перезагружается во время выполнения?
Anonymous Quiz
42%
Транзакция, записывающая данные на нестабильное хранилище
30%
Транзакция с использованием uncommitted read
17%
Транзакция с использованием двухфазной фиксации
11%
Транзакция, зафиксированная в журнале транзакций
Какая проблема Python связана с множественным наследованием ?
Спросят с вероятностью 3%
Множественное наследование позволяет классу наследовать от нескольких базовых классов, что может быть полезно, но также приводит к ряду проблем. Основные проблемы, связанные с множественным наследованием, включают:
1️⃣Проблема ромба (Diamond Problem):
✅Это ситуация, когда класс наследует от двух классов, которые оба наследуют от одного общего предка. Это может привести к неоднозначности в разрешении методов и атрибутов.
✅Пример:
2️⃣Проблемы с порядком разрешения методов (MRO - Method Resolution Order):
✅В Python для решения проблемы ромба используется алгоритм C3-линеаризации, который определяет порядок, в котором должны быть просмотрены базовые классы.
✅Можно использовать функцию
✅Пример:
3️⃣Управление состоянием и совместимость:
✅Классы могут иметь конфликтующие атрибуты и методы, что усложняет управление состоянием объектов.
✅Переопределение методов в одном классе может непредсказуемо повлиять на поведение других классов.
Как он решает эти проблемы
Использует несколько подходов для решения проблем, связанных с множественным наследованием:
1️⃣Алгоритм C3-линеаризации:
✅Этот алгоритм гарантирует корректный и предсказуемый порядок вызовов методов при множественном наследовании.
✅Порядок определяется как левая-направо, глубина-первый подход с корректировкой для избежания дублирования базовых классов.
2️⃣Использование функции
✅Функция
✅Это помогает избежать явного указания родительских классов и упрощает поддержку кода.
✅Пример:
Проблема множественного наследования связана с неоднозначностью порядка вызова методов и конфликтами атрибутов. Python решает эти проблемы с помощью алгоритма C3-линеаризации и функции
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 3%
Множественное наследование позволяет классу наследовать от нескольких базовых классов, что может быть полезно, но также приводит к ряду проблем. Основные проблемы, связанные с множественным наследованием, включают:
1️⃣Проблема ромба (Diamond Problem):
✅Это ситуация, когда класс наследует от двух классов, которые оба наследуют от одного общего предка. Это может привести к неоднозначности в разрешении методов и атрибутов.
✅Пример:
class A:
def method(self):
print("Method in A")
class B(A):
def method(self):
print("Method in B")
class C(A):
def method(self):
print("Method in C")
class D(B, C):
pass
d = D()
d.method() # Какой метод будет вызван: из B или из C?
2️⃣Проблемы с порядком разрешения методов (MRO - Method Resolution Order):
✅В Python для решения проблемы ромба используется алгоритм C3-линеаризации, который определяет порядок, в котором должны быть просмотрены базовые классы.
✅Можно использовать функцию
mro()
для просмотра порядка разрешения методов:print(D.mro())
✅Пример:
class A:
def method(self):
print("Method in A")
class B(A):
def method(self):
print("Method in B")
class C(A):
def method(self):
print("Method in C")
class D(B, C):
pass
d = D()
d.method() # Выведет: "Method in B", так как B стоит раньше C в MRO
3️⃣Управление состоянием и совместимость:
✅Классы могут иметь конфликтующие атрибуты и методы, что усложняет управление состоянием объектов.
✅Переопределение методов в одном классе может непредсказуемо повлиять на поведение других классов.
Как он решает эти проблемы
Использует несколько подходов для решения проблем, связанных с множественным наследованием:
1️⃣Алгоритм C3-линеаризации:
✅Этот алгоритм гарантирует корректный и предсказуемый порядок вызовов методов при множественном наследовании.
✅Порядок определяется как левая-направо, глубина-первый подход с корректировкой для избежания дублирования базовых классов.
2️⃣Использование функции
super()
:✅Функция
super()
позволяет корректно вызывать методы родительских классов, следуя порядку MRO.✅Это помогает избежать явного указания родительских классов и упрощает поддержку кода.
✅Пример:
class A:
def method(self):
print("Method in A")
class B(A):
def method(self):
super().method()
print("Method in B")
class C(A):
def method(self):
super().method()
print("Method in C")
class D(B, C):
def method(self):
super().method()
d = D()
d.method()
# Выведет:
# Method in A
# Method in C
# Method in B
Проблема множественного наследования связана с неоднозначностью порядка вызова методов и конфликтами атрибутов. Python решает эти проблемы с помощью алгоритма C3-линеаризации и функции
super()
, обеспечивающей корректный порядок разрешения методов.👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Какой HTTP метод REST API не соответствует принципу идемпотентности, согласно стандартному использованию?
Anonymous Quiz
34%
PUT
26%
DELETE
10%
GET
30%
POST
Для чего они нужны dunder методы ?
Спросят с вероятностью 3%
Dunder-методы представляют собой специальные методы, которые начинаются и заканчиваются двойным подчёркиванием (например,
Основные методы и их назначения
1️⃣Инициализация и завершение объектов:
✅
✅
2️⃣Представление объектов:
✅
✅
3️⃣Сравнение объектов:
✅
✅
✅
✅Аналогично можно определить методыСравнениДля чегоДля чего
4️⃣Арифметические операции:
✅
✅
✅
✅Аналогично можно определить методы для других арифметических операций:х назначения
Для чего они нДля чего Для чего
5️⃣Контейнерные операции:
✅
✅
6️⃣Итерация:
✅
7️⃣Контекстные менеджеры:
✅
✅
Зачем они нужны
1️⃣Упрощение работы с объектами: Позволяют легко определять, как объекты класса должны вести себя при использовании стандартных операторов и функций Python.
2️⃣Читаемость и удобство: Улучшают читаемость и удобство использования кода, делая объекты более интуитивными и естественными для работы.
3️⃣Переиспользование кода: Позволяют реализовать методы один раз и переиспользовать их в различных частях программы, что способствует уменьшению дублирования кода.
Dunder-методы позволяют классам интегрироваться с встроенными операциями и функциями, такими как арифметические операции, сравнения и представления. Они делают работу с объектами интуитивной и упрощают код.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 3%
Dunder-методы представляют собой специальные методы, которые начинаются и заканчиваются двойным подчёркиванием (например,
__init__
,Для чего __repr__
). Основные методы и их назначения
1️⃣Инициализация и завершение объектов:
✅
__init__(self, ...)
: Конструктор класса, вызывается при создании нового экземпляра.class MyClass:
def __init__(self, value):
self.value = value
✅
__del__(self)
: Деструктор, вызывается при удалении объекта.2️⃣Представление объектов:
✅
__str__(self)
: Определяет поведение функции str()
и print()
. Возвращает строковое представление объекта для пользователя.class MyClass:
def __init__(self, value):
self.value = value
def __str__(self):
return f'MyClass with value {self.value}'
✅
__repr__(self)
: Определяет поведение функции repr()
. Возвращает строковое представление объекта для разработчика.class MyClass:
def __init__(self, value):
self.value = value
def __repr__(self):
return f'MyClass({self.value!r})'
3️⃣Сравнение объектов:
✅
__eq__(self, other)
: Оператор равенства ==
.✅
__lt__(self, other)
: Оператор меньше <
.✅
__le__(self, other)
: Оператор меньше или равно <=
.✅Аналогично можно определить методыСравнениДля чегоДля чего
4️⃣Арифметические операции:
✅
__add__(self, other)
: Оператор сложения +
.✅
__sub__(self, other)
: Оператор вычитания -
.✅
__mul__(self, other)
: Оператор умножения *
.✅Аналогично можно определить методы для других арифметических операций:х назначения
Для чего они нДля чего Для чего
5️⃣Контейнерные операции:
✅
__len__(self)
: Возвращает длину объекта, используется в функции len()
.class MyContainer:
def __init__(self, items):
self.items = items
def __len__(self):
return len(self.items)
✅
__getitem__(self, key)
: Позволяет доступ к элементам по ключу (используется оператор []
).class MyContainer:
def __init__(self, items):
self.items = items
def __getitem__(self, index):
return self.items[index]
6️⃣Итерация:
✅
__iter__(self)
: Возвращает итератор для объекта.class MyContainer:
def __init__(self, items):
self.items = items
def __iter__(self):
return iter(self.items)
7️⃣Контекстные менеджеры:
✅
__enter__(self)
: Определяет действия при входе в контекст (with
).✅
__exit__(self, exc_type, exc_value, traceback)
: Определяет действия при выходе из контекста.class MyContextManager:
def __enter__(self):
print("Entering the context")
return self
def __exit__(self, exc_type, exc_value, traceback):
print("Exiting the context")
with MyContextManager():
print("Inside the context")
Зачем они нужны
1️⃣Упрощение работы с объектами: Позволяют легко определять, как объекты класса должны вести себя при использовании стандартных операторов и функций Python.
2️⃣Читаемость и удобство: Улучшают читаемость и удобство использования кода, делая объекты более интуитивными и естественными для работы.
3️⃣Переиспользование кода: Позволяют реализовать методы один раз и переиспользовать их в различных частях программы, что способствует уменьшению дублирования кода.
Dunder-методы позволяют классам интегрироваться с встроенными операциями и функциями, такими как арифметические операции, сравнения и представления. Они делают работу с объектами интуитивной и упрощают код.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Какое утверждение описывает ключевое отличие между списками и кортежами, которое влияет на производительность?
Anonymous Quiz
53%
Кортежи занимают меньше памяти, чем списки.
8%
Списки поддерживают более быструю индексацию элементов.
31%
Кортежи могут быть ключами словаря, в отличие от списков.
8%
Списки быстрее кортежей при выполнении сортировки.
Как бы реализовал метод new через singleton ?
Спросят с вероятностью 3%
Чтобы реализовать метод
Пример реализации Singleton с методом new
Объяснение кода
1️⃣Атрибут _instance:
✅
2️⃣Метод
✅Методреализовавызывается передл метод neи отвечает за создание нового экземпляра класса.
✅Если
✅Если
3️⃣Метод init:
✅Метод init выполняет инициализацию экземпляра.
✅Чтобы избежать повторной инициализации, проверяется наличие атрибута
Преимущества и особенности реализации
✅Контроль создания экземпляров: Метод new гарантирует, что создается только один экземпляр класса.
✅Предотвращение повторной инициализации: Метод init инициализируется только один раз, что предотвращает перезапись значений атрибутов при повторных вызовах.
Метод new используется в шаблоне Singleton для создания только одного экземпляра класса. Он контролирует процесс создания объекта, возвращая существующий экземпляр, если он уже создан.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 3%
Чтобы реализовать метод
__new__
для создания класса по шаблону Singleton, нужно следовать принципам, которые обеспечивают создание только одного экземпляра класса. Метод new отвечает за создание нового экземпляра класса, и его можно использовать для контроля этого процесса. Ниже приведен пример реализации Singleton с использованием метода new.Пример реализации Singleton с методом new
class Singleton:
_instance = None
def __new__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super(Singleton, cls).__new__(cls, args, kwargs)
return cls._instance
def __init__(self, value):
if not hasattr(self, 'initialized'):
self.value = value
self.initialized = True
# Проверка работы Singleton
singleton1 = Singleton(10)
singleton2 = Singleton(20)
print(singleton1 is singleton2) # Выведет: True
print(singleton1.value) # Выведет: 10
print(singleton2.value) # Выведет: 10
Объяснение кода
1️⃣Атрибут _instance:
✅
cls._instance
используется для хранения единственного экземпляра класса.2️⃣Метод
e):
✅Методреализовавызывается передл метод neи отвечает за создание нового экземпляра класса.
✅Если
_instance
равен None
, создается новый экземпляр с помощью super(Singleton, cls).__new__(cls, args, kwargs)
и сохраняется в _instance
.✅Если
_instance
уже существует, возвращается существующий экземпляр.3️⃣Метод init:
✅Метод init выполняет инициализацию экземпляра.
✅Чтобы избежать повторной инициализации, проверяется наличие атрибута
initialized
. Если он не существует, происходит инициализация атрибутов и устанавливается initialized = True
.Преимущества и особенности реализации
✅Контроль создания экземпляров: Метод new гарантирует, что создается только один экземпляр класса.
✅Предотвращение повторной инициализации: Метод init инициализируется только один раз, что предотвращает перезапись значений атрибутов при повторных вызовах.
Метод new используется в шаблоне Singleton для создания только одного экземпляра класса. Он контролирует процесс создания объекта, возвращая существующий экземпляр, если он уже создан.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Какой метод метакласса позволяет модифицировать атрибуты класса перед его созданием?
Anonymous Quiz
37%
__new__
41%
__init__
5%
__call__
17%
__prepare__
Как выражена инкапсуляция в python ?
Спросят с вероятностью 3%
Инкапсуляция выражена через механизмы, которые позволяют скрывать внутренние детали реализации класса и предоставлять доступ к данным и методам через определённый интерфейс. Достигается с помощью соглашений об именовании и специальных методов. Основные аспекты инкапсуляции включают:
Соглашения об именовании
1️⃣Приватные атрибуты и методы:
✅В Python соглашение об именовании позволяет сделать атрибуты и методы приватными, что предотвращает их случайное использование вне класса.
✅Атрибуты и методы, начинающиеся с одного подчёркивания (
✅Атрибуты и методы, начинающиеся с двойного подчёркивания (
Примеры использования
1️⃣Защищённые атрибуты и методы:
✅Они не предназначены для использования вне класса, но могут быть использованы в подклассах.
✅Их использование вне класса является плохой практикой, но технически возможно.
2️⃣Приватные атрибуты и методы:
✅Они подвергаются манглингу имён, что делает их труднодоступными из вне класса.
✅Внешний доступ возможен, но с использованием специального синтаксиса, что считается плохой практикой.
Свойства (Properties)
Предоставляют интерфейс для управления доступом к атрибутам и позволяют инкапсулировать логику доступа и изменения данных.
Инкапсуляция достигается с помощью соглашений об именовании (одинарное подчёркивание для защищённых и двойное подчёркивание для приватных атрибутов и методов) и использования свойств для управления доступом к атрибутам. Это позволяет скрывать внутренние детали реализации и предоставлять контролируемый интерфейс для взаимодействия с объектами.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 3%
Инкапсуляция выражена через механизмы, которые позволяют скрывать внутренние детали реализации класса и предоставлять доступ к данным и методам через определённый интерфейс. Достигается с помощью соглашений об именовании и специальных методов. Основные аспекты инкапсуляции включают:
Соглашения об именовании
1️⃣Приватные атрибуты и методы:
✅В Python соглашение об именовании позволяет сделать атрибуты и методы приватными, что предотвращает их случайное использование вне класса.
✅Атрибуты и методы, начинающиеся с одного подчёркивания (
_
), считаются защищёнными и не должны использоваться вне класса или подклассов.✅Атрибуты и методы, начинающиеся с двойного подчёркивания (
__
), подвергаются манглингу имён (name mangling), что делает их труднодоступными из вне класса.class MyClass:
def __init__(self, value):
self._protected_value = value # Защищённый атрибут
self.__private_value = value # Приватный атрибут
def _protected_method(self):
print("This is a protected method.")
def __private_method(self):
print("This is a private method.")
Примеры использования
1️⃣Защищённые атрибуты и методы:
✅Они не предназначены для использования вне класса, но могут быть использованы в подклассах.
✅Их использование вне класса является плохой практикой, но технически возможно.
class SubClass(MyClass):
def access_protected(self):
print(self._protected_value)
self._protected_method()
instance = SubClass(10)
instance.access_protected()
# Выведет:
# 10
# This is a protected method.
2️⃣Приватные атрибуты и методы:
✅Они подвергаются манглингу имён, что делает их труднодоступными из вне класса.
✅Внешний доступ возможен, но с использованием специального синтаксиса, что считается плохой практикой.
class AnotherClass:
def __init__(self, value):
self.__private_value = value
def __private_method(self):
print("This is a private method.")
def access_private(self):
print(self.__private_value)
self.__private_method()
instance = AnotherClass(20)
instance.access_private()
# Выведет:
# 20
# This is a private method.
# Попытка доступа к приватному атрибуту извне
# print(instance.__private_value) # AttributeError
# Доступ с использованием манглинга имён (не рекомендуется)
print(instance._AnotherClass__private_value) # Выведет: 20
Свойства (Properties)
Предоставляют интерфейс для управления доступом к атрибутам и позволяют инкапсулировать логику доступа и изменения данных.
class MyClassWithProperty:
def __init__(self, value):
self._value = value
@property
def value(self):
return self._value
@value.setter
def value(self, new_value):
if new_value > 0:
self._value = new_value
else:
raise ValueError("Value must be positive")
instance = MyClassWithProperty(10)
print(instance.value) # Выведет: 10
instance.value = 20
print(instance.value) # Выведет: 20
# instance.value = -10 # ValueError: Value must be positive
Инкапсуляция достигается с помощью соглашений об именовании (одинарное подчёркивание для защищённых и двойное подчёркивание для приватных атрибутов и методов) и использования свойств для управления доступом к атрибутам. Это позволяет скрывать внутренние детали реализации и предоставлять контролируемый интерфейс для взаимодействия с объектами.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Какой метод декоратора property позволяет установить значение атрибута, при этом применяя дополнительные проверки или вычисления?
Anonymous Quiz
16%
getter
67%
setter
1%
deleter
16%
updater
Как в python реализуются метод объекта ?
Спросят с вероятностью 3%
Методы объекта реализуются как функции, определённые внутри класса. Они могут работать с данными объекта и предоставляют интерфейс для взаимодействия с экземплярами класса. Важным аспектом методов объекта является то, что они принимают первым параметром
Пример реализации методов объекта
Объяснение кода
1️⃣Конструктор
✅Метод реализуютявляется специальным методом, который вызывается при создании нового экземпляра класса.
✅Он используется для инициализации атрибутов экземпляра.
2️⃣Метод display_value:
✅Этот метод выводит текущее значение атрибута value.
✅Он принимает только один параметр self, который автоматически передаётся при вызове метода у объекта.
3️⃣Метод increment_value:
✅Этот метод увеличивает значение атрибута value на заданное количество.
✅Он принимает два параметра: self и amount, где self — это ссылка на экземпляр, а amount — значение, на которое нужно увеличить value.
Использование self
Это ссылка на текущий экземпляр класса, которая позволяет доступ к его атрибутам и другим методам. Важно использовать self для чтения и изменения атрибутов экземпляра внутри методов.
Методы экземпляра, класса и статические методы
В дополнение к обычным методам объекта, также можно определить методы класса и статические методы.
1️⃣Методы класса:
✅Методы класса используют декоратор @classmethod и принимают первым параметром cls, который является ссылкой на сам класс.
✅Они полезны для работы с атрибутами класса или для создания экземпляров альтернативными способами.
2️⃣Статические методы:
Статические методы используют декоратор @staticmethod и не принимают ни self, ни cls.
✅Они полезны для функций, которые не зависят от состояния экземпляра или класса.
Методы объекта — это функции, определённые внутри класса, которые работают с данными экземпляра через параметр self. Методы класса и статические методы также могут быть определены с использованием декораторов @classmethod и @staticmethod соответственно.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 3%
Методы объекта реализуются как функции, определённые внутри класса. Они могут работать с данными объекта и предоставляют интерфейс для взаимодействия с экземплярами класса. Важным аспектом методов объекта является то, что они принимают первым параметром
self
, который является ссылкой на экземпляр класса.Пример реализации методов объекта
class MyClass:
def __init__(self, value):
self.value = value # Инициализация атрибута
def display_value(self):
print(f"The value is: {self.value}") # Метод для вывода значения атрибута
def increment_value(self, amount):
self.value += amount # Метод для увеличения значения атрибута на заданное количество
# Создание экземпляра класса
obj = MyClass(10)
# Вызов методов объекта
obj.display_value() # Выведет: The value is: 10
obj.increment_value(5)
obj.display_value() # Выведет: The value is: 15
Объяснение кода
1️⃣Конструктор
__init__
:✅Метод реализуютявляется специальным методом, который вызывается при создании нового экземпляра класса.
✅Он используется для инициализации атрибутов экземпляра.
2️⃣Метод display_value:
✅Этот метод выводит текущее значение атрибута value.
✅Он принимает только один параметр self, который автоматически передаётся при вызове метода у объекта.
3️⃣Метод increment_value:
✅Этот метод увеличивает значение атрибута value на заданное количество.
✅Он принимает два параметра: self и amount, где self — это ссылка на экземпляр, а amount — значение, на которое нужно увеличить value.
Использование self
Это ссылка на текущий экземпляр класса, которая позволяет доступ к его атрибутам и другим методам. Важно использовать self для чтения и изменения атрибутов экземпляра внутри методов.
Методы экземпляра, класса и статические методы
В дополнение к обычным методам объекта, также можно определить методы класса и статические методы.
1️⃣Методы класса:
✅Методы класса используют декоратор @classmethod и принимают первым параметром cls, который является ссылкой на сам класс.
✅Они полезны для работы с атрибутами класса или для создания экземпляров альтернативными способами.
class MyClass:
class_value = 0
def __init__(self, value):
self.value = value
@classmethod
def set_class_value(cls, new_value):
cls.class_value = new_value
# Вызов метода класса
MyClass.set_class_value(10)
print(MyClass.class_value) # Выведет: 10
2️⃣Статические методы:
Статические методы используют декоратор @staticmethod и не принимают ни self, ни cls.
✅Они полезны для функций, которые не зависят от состояния экземпляра или класса.
class MyClass:
@staticmethod
def static_method():
print("This is a static method")
# Вызов статического метода
MyClass.static_method() # Выведет: This is a static method
Методы объекта — это функции, определённые внутри класса, которые работают с данными экземпляра через параметр self. Методы класса и статические методы также могут быть определены с использованием декораторов @classmethod и @staticmethod соответственно.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Какой магический метод используется для перегрузки оператора умножения для экземпляра класса?
Anonymous Quiz
71%
__mul__
9%
__add__
9%
__div__
11%
__mod__
Какие методы в метаклассах используются ?
Спросят с вероятностью 3%
Метаклассы предоставляют возможность управления созданием и поведением классов. Основными методами, которые используются в метаклассах, являются:
1️⃣`__new__`: Отвечает за создание нового класса. Он вызывается до
2️⃣`__init__`: Инициализирует класс, после того как он был создан. В метаклассе init используется для модификации созданного класса, например, добавления атрибутов или методов.
3️⃣`__call__`: Позволяет метаклассу контролировать процесс создания экземпляров класса. Он вызывается, когда создаётся новый объект класса.
Рассмотрим пример использования этих методов:
В этом примере:
✅Метод
✅Метод init выполняет инициализацию класса и может быть использован для дальнейших модификаций.
✅Метод call контролирует создание экземпляров класса и выполняет необходимые действия при создании нового объекта.
Методы new, init и call в метаклассах используются для управления процессами создания и инициализации классов, а также создания их экземпляров. Они позволяют модифицировать классы на различных этапах их жизненного цикла.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 3%
Метаклассы предоставляют возможность управления созданием и поведением классов. Основными методами, которые используются в метаклассах, являются:
1️⃣`__new__`: Отвечает за создание нового класса. Он вызывается до
__init__
и используется для создания нового объекта класса. В метаклассе new позволяет изменять процесс создания класса.2️⃣`__init__`: Инициализирует класс, после того как он был создан. В метаклассе init используется для модификации созданного класса, например, добавления атрибутов или методов.
3️⃣`__call__`: Позволяет метаклассу контролировать процесс создания экземпляров класса. Он вызывается, когда создаётся новый объект класса.
Рассмотрим пример использования этих методов:
class MyMeta(type):
def __new__(cls, name, bases, dct):
print(f'Creating class {name}')
# Добавление нового атрибута
dct['added_attribute'] = 'I was added by MyMeta'
return super().__new__(cls, name, bases, dct)
def __init__(cls, name, bases, dct):
print(f'Initializing class {name}')
super().__init__(name, bases, dct)
def __call__(cls, *args, **kwargs):
print(f'Creating instance of class {cls.__name__}')
return super().__call__(*args, **kwargs)
class MyClass(metaclass=MyMeta):
def __init__(self):
print('Instance initialized')
# Создание экземпляра класса
instance = MyClass()
print(instance.added_attribute)
В этом примере:
✅Метод
ating insдобавляет новый атрибут
added_attribute
к классу.✅Метод init выполняет инициализацию класса и может быть использован для дальнейших модификаций.
✅Метод call контролирует создание экземпляров класса и выполняет необходимые действия при создании нового объекта.
Методы new, init и call в метаклассах используются для управления процессами создания и инициализации классов, а также создания их экземпляров. Они позволяют модифицировать классы на различных этапах их жизненного цикла.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Что такое diamondproblem ?
Спросят с вероятностью 3%
Проблема ромбовидного наследования (Diamond Problem) возникает в ООП при использовании множественного наследования. Суть проблемы заключается в неоднозначности, возникающей из-за наследования от нескольких классов, имеющих общего предка.
Рассмотрим пример:
В этом примере:
✅Класс
✅Классы
✅Класс
Когда мы вызываем метод
Решение проблемы ромбовидного наследования
Использует метод разрешения порядка (MRO - Method Resolution Order) для решения этой проблемы. MRO определяет порядок, в котором методы должны вызываться в случае множественного наследования. Для просмотра MRO можно использовать атрибут
Результат будет следующим:
Согласно этому порядку, метод
Если классы
Результат выполнения будет:
В этом случае методы всех классов вызываются в порядке, определённом MRO.
Проблема ромбовидного наследования возникает при множественном наследовании и приводит к неоднозначности, какой метод вызывать. Решает эту проблему с помощью MRO (Method Resolution Order), определяющего порядок вызова методов.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 3%
Проблема ромбовидного наследования (Diamond Problem) возникает в ООП при использовании множественного наследования. Суть проблемы заключается в неоднозначности, возникающей из-за наследования от нескольких классов, имеющих общего предка.
Рассмотрим пример:
class A:
def method(self):
print("Method in A")
class B(A):
def method(self):
print("Method in B")
class C(A):
def method(self):
print("Method in C")
class D(B, C):
pass
d = D()
d.method()
В этом примере:
✅Класс
A
является базовым классом.✅Классы
B
и C
наследуют от класса A
и переопределяют метод method
.✅Класс
D
наследует от классов B
и C
.Когда мы вызываем метод
method
через экземпляр класса D
(d.method()
), возникает вопрос: какой именно метод должен быть вызван - из класса B
или из класса C
? Это и есть проблема ромбовидного наследования.Решение проблемы ромбовидного наследования
Использует метод разрешения порядка (MRO - Method Resolution Order) для решения этой проблемы. MRO определяет порядок, в котором методы должны вызываться в случае множественного наследования. Для просмотра MRO можно использовать атрибут
__mro__
или функцию mro()
.print(D.__mro__)
Результат будет следующим:
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
Согласно этому порядку, метод
method
будет взят из класса B
, так как он идёт первым в MRO. Поэтому при вызове d.method()
, выведется:Method in B
Если классы
B
и C
используют super()
, можно правильно вызвать методы всех классов-предков:class A:
def method(self):
print("Method in A")
class B(A):
def method(self):
print("Method in B")
super().method()
class C(A):
def method(self):
print("Method in C")
super().method()
class D(B, C):
def method(self):
print("Method in D")
super().method()
d = D()
d.method()
Результат выполнения будет:
Method in D
Method in B
Method in C
Method in A
В этом случае методы всех классов вызываются в порядке, определённом MRO.
Проблема ромбовидного наследования возникает при множественном наследовании и приводит к неоднозначности, какой метод вызывать. Решает эту проблему с помощью MRO (Method Resolution Order), определяющего порядок вызова методов.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых