В объектно-ориентированном программировании мы часто сталкиваемся с проблемой управления иерархией наследования. Как можно сделать наследование более гибким и эффективным? Для этого существует позднее связывание или 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.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.