Наследование и композиция: руководство по ООП в Python Еще один блог веб-разработчика

Это означает, что Horse наследует интерфейс и реализацию Animal, и объекты Horse могут использоваться для замены объектов Animal в приложении. Класс наследник берет весь функционал родительского класса, и позволяет нам добавлять новый функционал. В этой статье мы с вами разберемся на примерах, как использовать наследование классов. Наследование в программировании на Python — довольно широкая тема, глубоко уходящая корнями в структуру объектно-ориентированного программирования.

наследование классов python

В этом смысле терминология “родительский и дочерний класс” не совсем верна. Наследование в ООП – это скорее аналог систематизации и классификации наподобие той, что есть в живой природе. Все млекопитающие имеют четырехкамерное сердце, но только носороги – рог. Получается, что нам внутри метода потомка нужно получить доступ к методу предка.

Python: Классы, наследование и модули

Обычно после этого в теле метода подкласса пишется дополнительный код. Наследование – важная составляющая объектно-ориентированного программирования. Так или иначе мы уже сталкивались с ним, ведь объекты наследуют атрибуты своих классов. Однако обычно под наследованием в ООП понимается наличие классов и подклассов.

наследование классов python

Тем не менее, будут случаи, когда наследование будет иметь больше смысла. Если дизайн основан на наследовании, нужно найти способ изменить тип объекта, чтобы изменить его поведение. С композицией просто нужно изменить политику, которую использует объект. SalaryPolicy инициализируется значением weekly_salary, которое затем используется в .calculate_payroll(). HourlyPolicy инициализируется с помощью hour_rate и реализует .calculate_payroll(), используя базовый класс hours_worked. Самая большая проблема заключается не столько в количестве классов в дизайне, сколько в том, насколько тесно связаны отношения между этими классами.

Наследование и композиция: руководство по ООП в Python

Открытый интерфейс сначала проверяет, была ли применена _base_policy, а затем реализует функциональность в соответствии с этой базовой политикой. Метод .track_work() просто делегирует базовую политику, а .calculate_payroll() использует его для вычисления base_salary, а затем возвращает 60%. Класс Employee теперь инициализируется идентификатором и использует открытые функции, представленные в других модулях, для инициализации его атрибутов. Везде мы подразумеваем, что должна быть только одна _AddressBook, одна _PayrollSystem и одна _ProductivitySystem.

наследование классов python

Определив новый класс, можно создавать сколько угодно объектов на его основе. Как уже было сказано выше, такая структура данных может включать в себя некие свойства, то есть переменные, которыми будет наделен каждый экземпляр класса. В примере описывается класс под названием Data со строкой word и числом number. Классы в языке Python являются важнейшей частью объектно-ориентированного подхода к программированию. Класс описывает пользовательский тип данных, на основе которого в программе создаются однородные объекты.

Конструктор

Класс Employee – это составной объект, который содержит несколько объектов, предоставляющих различные функциональные возможности. Он содержит Address, который реализует все функции, связанные с местом проживания сотрудника. Опять же, мы делаем внутренним _PayrollSystem и предоставляем открытый интерфейс к ней. Приложение будут использовать открытый интерфейс для получения политик и расчета заработной платы. Если вы посмотрите на реализацию класса EmployeeDatabase, вы заметите, что он использует ._create_employee() для создания объекта Employee с правильными параметрами. С композицией класс Composite имеет экземпляр класса Component и может использовать его реализацию.

  • Python позволяет нам наследоваться от двух разных классов, указав их в скобках в объявлении класса.
  • Бывает, объекты разных родственных классов создаются или обрабатываются в одном цикле, то есть по одному алгоритму.
  • Это означает, что теперь метод __init__() определенный в классе Triangle() имеет предпочтение перед тем же методом в классе Polygon().
  • Поэтому, если требуется допустить создание объектов от дочернего класса без передачи аргументов, придется назначить значения по умолчанию также в конструкторе дочернего класса.
  • _EmployeeDatabase сделан приватным, и внизу мы создаем только один экземпляр.
  • У всех есть свойство, содержащее уникальный номер объекта, и свойство, в котором хранится принадлежность команде.

Давайте напишем программу, которая иллюстрирует проблему с наследуемым Square от Rectangle. Принцип замещения Лисков является наиболее важным руководящим принципом для определения того, является ли наследование подходящим решением для проектирования. К счастью, есть простой тест, который вы можете использовать, чтобы определить, соответствует ли ваш проект принципу подстановки Лисков. Первое решение использовало множественное наследование, а второе – композицию. Python не поддерживает шаблоны, но вы можете добиться аналогичных результатов, используя композицию, как вы видели в примере выше.

Примеры

После этого атрибут не будет виден за пределами класса через объект. Метод issubclass(sub, sup) используется для проверки отношений между указанными классами. Он возвращает true, если первый класс является подклассом второго класса, и false в противном случае.

Мы также создали метод .get_employee_info() для возврата информации для указанного сотрудника employee_id. Сейчас вы можете спросить, когда использовать наследование, а когда композицию в Python. Пришлось бы создать новый класс и изменить тип сотрудника менеджера. И не было бы никаких шансов, что бы можно было изменить политику во время выполнения. Программа получает список сотрудников из EmployeeDatabase и извлекает первого сотрудника, который нам нужен. Затем она создает новый HourlyPolicy, инициализированный с 55 долларов в час, и назначает его объекту менеджера.

Пример использования наследования

Согласно этой уже устаревшей концепции, каждая отдельно взятая программа является иерархической структурой из функциональных блоков кода. Обратите внимание, что LTDPolicy не наследуется от PayrollPolicy, но реализует тот принципы ооп python же интерфейс. Это связано с тем, что реализация полностью отличается, поэтому мы не хотим наследовать какую-либо реализацию PayrollPolicy. Сначала мы импортируем соответствующие функции и классы из других модулей.

Сначала мы сделали класс _ProductivitySystem внутренним, а затем создали внутреннюю переменную _productivity_system для модуля. Таким образом мы сообщаем другим разработчикам, что им не следует создавать или использовать _ProductivitySystem напрямую. Вместо этого мы создали две функции, get_role() и track(), как открытый интерфейс для модуля. Композиционные отношения между двумя классами считаются слабосвязанными.

Leave a Reply

Your email address will not be published. Required fields are marked *