🐍 Python  ·  20 вопросов  ·  ~50 мин  ·  ⏱ Таймер 50:00  ·  Средний  · 

Наследование и композиция

Учит выбирать композицию, понимать переопределение, super и порядок поиска методов. Тест построен вокруг реальных фрагментов и решений: от «Наследование» и «Переопределение» до «super и MRO» и «Композиция». Все задания рассчитаны на CPython 3.12; отличия других реализаций или версий учитываются только там, где это прямо оговорено.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Версия: CPython 3.12. Выберите один ответ из четырёх. На 20 вопросов отведено не меньше 40 минут; код лучше читать построчно. После завершения вы увидите общий процент, четыре тематические шкалы и объяснение каждого ответа.
Вопрос 1 из 20
Какой метод будет вызван?
Python
class Base:
    def speak(self): return "base"
class Child(Base):
    def speak(self): return "child"
print(Child().speak())
Вопрос 2 из 20
Что произойдёт при несовместимом переопределении?
Python
class Base:
    def save(self, data): return True
class Child(Base):
    def save(self): return True
Child().save("x")
Вопрос 3 из 20
Проследите кооперативную цепочку `super()`. В каком порядке имена классов попадут в список?
Python
class A:
    def f(self): return ["A"]
class B(A):
    def f(self): return ["B"] + super().f()
class C(B):
    def f(self): return ["C"] + super().f()
print(C().f())
Вопрос 4 из 20
Объект использует заменяемый компонент, но не является его разновидностью. Какое проектное решение выбрать?
Вопрос 5 из 20
Для ромбовидной иерархии во фрагменте какой точный MRO вернёт `D.mro()`?
Python
class A: pass
class B(A): pass
class C(A): pass
class D(B, C): pass
print([cls.__name__ for cls in D.__mro__])
Вопрос 6 из 20
Подкласс не вызывает `super().__init__()`, после чего читается атрибут `ready`. Чем закончится этот граничный сценарий?
Вопрос 7 из 20
Переопределение сузило допустимые входы базового метода. Какое исправление сохранит контракт подстановки?
Вопрос 8 из 20
Что выведет композиция?
Python
class Engine:
    def start(self): return "on"
class Car:
    def __init__(self, engine): self.engine = engine
    def drive(self): return self.engine.start() + " drive"
print(Car(Engine()).drive())
Вопрос 9 из 20
Почему прямой вызов `Parent.method(self)` менее гибок, чем `super().method()` в множественном наследовании?
Вопрос 10 из 20
По MRO класса `D` какое значение атрибута `value` будет найдено первым?
Python
class A:
    value = "A"
class B(A):
    value = "B"
class C(A):
    value = "C"
class D(B, C): pass
print(D().value)
Вопрос 11 из 20
Что такое mixin в удачном дизайне?
Вопрос 12 из 20
Что выведет вызов classmethod через подкласс?
Python
class Base:
    @classmethod
    def make(cls): return cls.__name__
class Child(Base): pass
print(Child.make())
Вопрос 13 из 20
Почему наследование только ради доступа к вспомогательным функциям — слабое основание?
Вопрос 14 из 20
Как поведёт себя super в D?
Python
class A:
    def f(self): return "A"
class B(A):
    def f(self): return "B" + super().f()
class C(A):
    def f(self): return "C" + super().f()
class D(B, C): pass
print(D().f())
Вопрос 15 из 20
Когда абстрактный базовый класс полезнее неформального соглашения?
Вопрос 16 из 20
Что произойдёт с abstractmethod?
Python
from abc import ABC, abstractmethod
class A(ABC):
    @abstractmethod
    def run(self): ...
class B(A): pass
B()
Вопрос 17 из 20
Как проверить, что композиция действительно ослабила связь?
Вопрос 18 из 20
Проследите вход в `B.__init__`, вызов `super()` и возврат. В каком порядке появятся строки?
Python
class A:
    def __init__(self): print("A")
class B(A):
    def __init__(self): print("B1"); super().__init__(); print("B2")
B()
Вопрос 19 из 20
Какая проблема у глубокой иерархии из шести уровней?
Вопрос 20 из 20
Что вернёт isinstance при виртуальной регистрации ABC?
Python
from abc import ABC
class A(ABC): pass
class X: pass
A.register(X)
print(isinstance(X(), A))

Ответьте на все 20 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу