Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+666новых вакансий за сутки·52 265вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 686
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 394 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python5 973
  • Облачные технологии4 523
  • QA вакансии1 689
  • Android1 143
  • Инженер данных788
  • Продакт-менеджер308

Разработка

  • iOS1 093
  • Backend вакансии1 020
  • Fullstack вакансии448
  • AI вакансии378
  • Frontend вакансии369
  • Mobile вакансии27

По стеку

  • Go3 345
  • Java2 037
  • Kotlin908
  • Node.js746
  • Rust492
  • .NET481
  • PHP278
  • C++213
  • C#199

DevOps и инфраструктура

  • Kubernetes2 562
  • Linux-инфраструктура2 030
  • DevOps вакансии1 855
  • Terraform / IaC1 548
  • CI/CD876
  • Мониторинг и Observability709
  • SRE229
  • Кибербезопасность40

Аналитика и данные

  • Аналитик данных479
  • Data Scientist443
  • Бизнес-аналитик342
  • Системный аналитик50

Другие направления

  • Проджект-менеджер107
  • UI/UX дизайн70
  • Ручное тестирование14

По регионам

  • Вакансии в США24 039
  • Вакансии в Европе9 373
  • Работа в России2 968
  • Вакансии в Канаде2 114

По формату

  • Удалённые вакансии41 595
  • Релокация в США24 039
  • Гибридная работа5 209
  • Офисная работа3 834

По уровню

  • Senior вакансии22 591
  • Middle вакансии12 174
  • Junior вакансии4 013

Сейчас нанимают

Все компании
  • Rakuten189 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Wise81 вакансия
  • Infobip28 вакансий
  • Darktrace17 вакансий
  • Spotify17 вакансий
  • Celonis14 вакансий
  • UiPath13 вакансий
  • Adyen9 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме PythonВсе вопросы
PythonJuniorТеория

Как работает наследование в Python?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Класс наследует атрибуты и методы от базового. Поиск атрибута идёт по MRO (cls.__mro__), super() вызывает следующий по MRO. Поддерживается множественное наследование (C3-линеаризация). Часто лучше композиция: дешевле менять и тестировать.

Пример

class Animal:
    def __init__(self, name: str):
        self.name = name

    def speak(self) -> str:
        return "..."


class Dog(Animal):
    def speak(self) -> str:
        # Можно переопределить полностью или дёрнуть родителя
        base = super().speak()
        return f"{base} woof"


d = Dog("Rex")
print(d.speak())          # ... woof
print(Dog.__mro__)        # (Dog, Animal, object)
print(isinstance(d, Animal))  # True


# Множественное наследование + кооперативный super
class Walker:
    def __init__(self, **kw):
        print("Walker.__init__")
        super().__init__(**kw)


class Swimmer:
    def __init__(self, **kw):
        print("Swimmer.__init__")
        super().__init__(**kw)


class Duck(Walker, Swimmer, Animal):
    def __init__(self, name: str):
        super().__init__(name=name)


Duck("Donald")
# Walker.__init__
# Swimmer.__init__
# (Animal.__init__ принимает name → self.name = 'Donald')
print(Duck.__mro__)
# Duck → Walker → Swimmer → Animal → object

Базовая механика

Класс-наследник получает доступ ко всем атрибутам/методам предков. Когда происходит обращение obj.attr:

  1. Сначала Python ищет attr в obj.__dict__ (instance attribute) — кроме data descriptors.
  2. Затем по type(obj).__mro__ (Method Resolution Order) обходит классы слева направо: own class → parents → ... → object.
  3. Если найден descriptor (например, function, property, classmethod) — применяется descriptor protocol, метод биндится к экземпляру.
  4. Если не найдено — вызывается __getattr__ (если определён), иначе AttributeError.

MRO вычисляется один раз при создании класса по алгоритму C3 (см. отдельный вопрос). При множественном наследовании C3 гарантирует local precedence order и monotonicity, иначе бросает TypeError.

super()

super() возвращает прокси-объект, который ищет атрибут начиная со следующего класса по MRO текущего экземпляра. Это позволяет кооперативное наследование: каждый __init__ вызывает super().__init__(), и цепочка инициализаций проходит по всему MRO.

Что наследуется и что нет

  • Наследуются: все методы (включая dunder), class-level атрибуты, __slots__ (с нюансами).
  • __init_subclass__ вызывается при создании подкласса — удобно для регистрации/валидации.
  • Class-level mutable атрибут (options = []) разделяется между всеми наследниками — частый источник багов.
  • Static-методы и class-методы наследуются и работают через MRO.

Композиция vs наследование

  • Наследование уместно, если есть истинное «is-a» и LSP не нарушается: Dog is Animal.
  • Композиция — когда «has-a» или просто шарим поведение: UserService has UserRepository.
  • Mixin — узкие добавки поведения без состояния: JSONSerializableMixin, TimestampMixin.
  • Для интерфейсов лучше Protocol/ABC, чем абстрактные базовые классы с шаблонными методами.

Подводные камни

  • Class-level mutable: class A: cache = [] — общий объект для всех экземпляров и наследников.
  • Глубокая иерархия (3+ уровня) — больно тестировать и менять; предпочитайте композицию.
  • super().__init__ пропущен в одном из mixin-ов — следующая часть MRO не инициализируется.
  • Множественное наследование с конфликтом MRO — TypeError при определении класса.
  • Передача **kwargs до object.__init__ — он не принимает аргументов; последний mixin перед object должен «съесть» остатки.
  • Использовать наследование для повторного использования кода, нарушая LSP — починка одного места ломает другое.

Частые вопросы на собеседовании

  • Что такое truthy и falsy значения в Python?
  • Когда использовать threading?
  • Что такое type hints и зачем они нужны?
  • Как работает yield?

Типичные ошибки

  • Говорить, что методы копируются в дочерний класс.
  • Не упоминать MRO.
  • Путать наследование интерфейса и наследование реализации.

Что проверяет интервьюер

  • Объясняет поиск атрибутов по MRO.
  • Понимает override.
  • Знает, когда композиция лучше наследования.

Как вы знаете этот вопрос?

Проверить себя по теме Python →

Источники

  • https://docs.python.org/3/reference/datamodel.html

Связанные темы

PythonArchitectureClasses