Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Позднее связывание Python: Погружаясь в классы

В объектно-ориентированном программировании мы часто сталкиваемся с проблемой управления иерархией наследования. Как можно сделать наследование более гибким и эффективным? Для этого существует позднее связывание или late binding.

В этом уроке мы изучим, что это такое, как это работает и почему это так важно для объектно-ориентированного дизайна.

Понимание позднего связывания

Позднее связывание или late binding — важное понятие в объектно-ориентированном программировании, которое позволяет более гибко и эффективно использовать наследование.

Вспомним базовый класс HTMLElement из предыдущего урока. Внутри него мы используем self для доступа к атрибутам класса:

class HTMLElement:
    def __init__(self, attributes=None):
        if attributes is None:
            attributes = {}
        self.attributes = attributes

    def get_attribute(self, key):
        return self.attributes[key]

Внутри класса HTMLElement мы используем self для доступа к атрибутам класса. В этом классе есть два метода: __init__ — для инициализации атрибутов и get_attribute — для доступа к ним.

Предположим, что мы создаем объект класса HTMLAnchorElement, который наследуется от HTMLElement. Каким будет self внутри методов родительского класса? Правильный ответ: HTMLAnchorElement, то есть того класса, объект которого мы создаем:

class A:
    __name = 'From A'

    def get_name(self):
        print('Current class:', type(self).__name__)
        return self.__name

class B(A):
    pass

a = A()
print(a.get_name())
# => Current class: A
# => From A

b = B()
print(b.get_name())
# => Current class: B
# => From A

В этом коде класс B наследует класс A. Когда мы создаем объект класса B и вызываем метод get_name, self внутри метода get_name ссылается на объект класса B, а не A.

Это свойство self называется поздним связыванием. Оно означает, что на момент определения класса тип self неизвестен. В качестве текущего объекта может выступать объект любого класса, производного от текущего.

Все выглядит так, будто код внутри базового класса копируется и переносится в каждый производный класс. Позднее связывание игнорирует глубину иерархии наследования — self всегда будет объектом того класса, который создается в коде.

Позднее связывание — важный элемент в работе наследования. Без него взаимодействие классов стало бы значительно сложнее и ограниченнее. Каждый объект должен был бы наверняка знать, к какому классу конкретно относятся свойства и методы в цепочке наследования. Понадобился бы специальный синтаксис для доступа к ним.

Выводы

Позднее связывание является полезным принципом, который обеспечивает гибкость при использовании и переопределении методов и атрибутов классов. Без этого принципа взаимодействие между классами было бы затруднено и ограничено. Понимание этого принципа является важным для тех, кто стремится более глубоко разобраться в работе классов и объектов в Python.


Дополнительные материалы

  1. Позднее связывание (Wiki)

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
Обучитесь разработке бэкенда сайтов и веб-приложений — серверной части, которая отвечает за логику и базы данных
10 месяцев
с нуля
Старт 28 ноября

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»