Projektowanie dla dziedziczenia i polimorfizmu

Programowanie obiektowe w Pythonie

Alex Yarosh

Content Quality Analyst @ DataCamp

Polimorfizm

 

 

Używanie jednolitego interfejsu do operowania na obiektach różnych klas

Programowanie obiektowe w Pythonie

hierarchia klas kont

Programowanie obiektowe w Pythonie

Liczy się tylko interfejs

# 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()
Programowanie obiektowe w Pythonie

Zasada podstawienia Liskov

 

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

zdjęcie Barbary Liskov

Programowanie obiektowe w Pythonie

Zasada podstawienia Liskov

 

Klasa bazowa powinna być wymienna z dowolną podklasą bez zmiany właściwości programu

Składniowo
  • sygnatury funkcji są zgodne
    • argumenty, zwracane wartości
Semantycznie
  • stan obiektu i programu pozostaje spójny
    • metoda podklasy nie wzmacnia warunków wejściowych
    • metoda podklasy nie osłabia warunków wyjściowych
    • brak dodatkowych wyjątków
Programowanie obiektowe w Pythonie

Naruszanie LSP

→ 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

Programowanie obiektowe w Pythonie

Naruszanie LSP

→ Modyfikowanie dodatkowych atrybutów w metodzie podklasy

→ Zgłaszanie dodatkowych wyjątków w metodzie podklasy

Programowanie obiektowe w Pythonie

 

 

 

 

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

Programowanie obiektowe w Pythonie

Czas na ćwiczenia!

Programowanie obiektowe w Pythonie

Preparing Video For Download...