Programowanie obiektowe w Pythonie
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() nie musi sprawdzać obiektu, aby wywołać właściwe withdraw()
Klasa bazowa powinna być wymienna z dowolną podklasą bez zmiany właściwości programu
Wszędzie tam, gdzie działa BankAccount, powinien działać również CheckingAccount

Klasa bazowa powinna być wymienna z dowolną podklasą bez zmiany właściwości programu
→ Niezgodność składniowa
BankAccount.withdraw() wymaga 1 parametru, ale CheckingAccount.withdraw() wymaga 2
→ Podklasa wzmacnia warunki wejściowe
BankAccount.withdraw() akceptuje dowolną kwotę, ale CheckingAccount.withdraw() zakłada, że kwota jest ograniczona
→ Podklasa osłabia warunki wyjściowe
BankAccount.withdraw() może pozostawić tylko dodatnie saldo lub zgłosić błąd, CheckingAccount.withdraw() może pozostawić saldo ujemne
→ Modyfikowanie dodatkowych atrybutów w metodzie podklasy
→ Zgłaszanie dodatkowych wyjątków w metodzie podklasy
$$\text{\textbf{\Huge{No LSP -- No Inheritance}}}$$
Programowanie obiektowe w Pythonie