Объектно-ориентированное программирование на Python
Alex Yarosh
Content Quality Analyst @ DataCamp

# 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() вызвать
Базовый класс должен быть взаимозаменяем с любым из своих подклассов без изменения свойств программы
Где работает BankAccount, там должен работать и CheckingAccount

Базовый класс должен быть взаимозаменяем с любым из своих подклассов без изменения свойств программы
→ Синтаксическая несовместимость
BankAccount.withdraw() требует 1 параметр, а CheckingAccount.withdraw() — 2
→ Подкласс усиливает входные условия
BankAccount.withdraw() принимает любую сумму, а CheckingAccount.withdraw() предполагает ограничение суммы
→ Подкласс ослабляет выходные условия
BankAccount.withdraw() допускает только положительный баланс или ошибку, а CheckingAccount.withdraw() может оставить баланс отрицательным
→ Изменение дополнительных атрибутов в методе подкласса
→ Генерация дополнительных исключений в методе подкласса
$$\text{\textbf{\Huge{No LSP -- No Inheritance}}}$$
Объектно-ориентированное программирование на Python