Designa för arv och polymorfism

Objektorienterad programmering i Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Polymorfism

 

 

Använda ett enhetligt gränssnitt för att hantera objekt av olika klasser

Objektorienterad programmering i Python

hierarki för konteklasser

Objektorienterad programmering i Python

Gränssnittet är det som räknas

# 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() behöver inte kontrollera objektet för att veta vilken withdraw() som ska anropas
Objektorienterad programmering i Python

Liskovs substitutionsprincip

 

Basklassen ska vara utbytbar mot vilken som helst av dess underklasser utan att programmets egenskaper förändras

Överallt där BankAccount fungerar ska CheckingAccount också fungera

foto av Barbara Liskov

Objektorienterad programmering i Python

Liskovs substitutionsprincip

 

Basklassen ska vara utbytbar mot vilken som helst av dess underklasser utan att programmets egenskaper förändras

Syntaktiskt
  • funktionssignaturer är kompatibla
    • argument, returvärden
Semantiskt
  • objektets och programmets tillstånd förblir konsekvent
    • underklassens metod skärper inte invillkor
    • underklassens metod försvagar inte utvillkor
    • inga ytterligare undantag
Objektorienterad programmering i Python

Bryta mot LSP

Syntaktisk inkompatibilitet

BankAccount.withdraw() kräver 1 parameter, men CheckingAccount.withdraw() kräver 2

Underklass skärper invillkor

BankAccount.withdraw() accepterar vilket belopp som helst, men CheckingAccount.withdraw() förutsätter att beloppet är begränsat

Underklass försvagar utvillkor

BankAccount.withdraw() kan bara lämna ett positivt saldo eller orsaka ett fel, medan CheckingAccount.withdraw() kan lämna saldot negativt

Objektorienterad programmering i Python

Bryta mot LSP

→ Ändrar ytterligare attribut i underklassens metod

→ Kastar ytterligare undantag i underklassens metod

Objektorienterad programmering i Python

 

 

 

 

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

Objektorienterad programmering i Python

Nu kör vi en övning!

Objektorienterad programmering i Python

Preparing Video For Download...