Проектирование с учётом наследования и полиморфизма

Объектно-ориентированное программирование на Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Полиморфизм

 

 

Единый интерфейс для работы с объектами разных классов

Объектно-ориентированное программирование на Python

иерархия классов счетов

Объектно-ориентированное программирование на Python

Важен только интерфейс

# Withdraw amount from each of accounts in list_of_accounts
def batch_withdraw(list_of_accounts, amount):
   for acct in list_of_accounts:
      acct.withdraw(amount)

b, c, s = BankAccount(1000), CheckingAccount(2000), SavingsAccount(3000) batch_withdraw([b,c,s]) # <-- Will use BankAccount.withdraw(), # then CheckingAccount.withdraw(), # then SavingsAccount.withdraw()
  • batch_withdraw() не нужно проверять объект, чтобы определить, какой withdraw() вызвать
Объектно-ориентированное программирование на Python

Принцип подстановки Лисков

 

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

Где работает BankAccount, там должен работать и CheckingAccount

фото Барбары Лисков

Объектно-ориентированное программирование на Python

Принцип подстановки Лисков

 

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

Синтаксически
  • сигнатуры функций совместимы
    • аргументы, возвращаемые значения
Семантически
  • состояние объекта и программы остаётся согласованным
    • метод подкласса не усиливает входные условия
    • метод подкласса не ослабляет выходные условия
    • никаких дополнительных исключений
Объектно-ориентированное программирование на Python

Нарушение принципа подстановки Лисков

Синтаксическая несовместимость

BankAccount.withdraw() требует 1 параметр, а CheckingAccount.withdraw() — 2

Подкласс усиливает входные условия

BankAccount.withdraw() принимает любую сумму, а CheckingAccount.withdraw() предполагает ограничение суммы

Подкласс ослабляет выходные условия

BankAccount.withdraw() допускает только положительный баланс или ошибку, а CheckingAccount.withdraw() может оставить баланс отрицательным

Объектно-ориентированное программирование на Python

Нарушение принципа подстановки Лисков

→ Изменение дополнительных атрибутов в методе подкласса

→ Генерация дополнительных исключений в методе подкласса

Объектно-ориентированное программирование на Python

 

 

 

 

$$\text{\textbf{\Huge{No LSP -- No Inheritance}}}$$

Объектно-ориентированное программирование на Python

Давайте потренируемся!

Объектно-ориентированное программирование на Python

Preparing Video For Download...