Об'єктноорієнтоване програмування в 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{Немає LSP — немає наслідування}}}$$
Об'єктноорієнтоване програмування в Python