Conception pour l'héritage et le polymorphisme

Programmation orientée objet en Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Polymorphisme

 

 

Utiliser une interface unifiée pour opérer sur des objets de différentes classes

Programmation orientée objet en Python

hiérarchie des classes de compte

Programmation orientée objet en Python

Seule l'interface compte

# Retirer un montant de chaque compte dans 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]) # <-- Utilisera BankAccount.withdraw(), # puis CheckingAccount.withdraw(), # puis SavingsAccount.withdraw()
  • batch_withdraw() n'a pas besoin de vérifier l'objet pour savoir quel withdraw() appeler
Programmation orientée objet en Python

Principe de substitution de Liskov

 

La classe de base doit être interchangeable avec ses sous-classes sans altérer les propriétés du programme

Partout où BankAccount fonctionne, CheckingAccount doit aussi fonctionner

photo de Barbara Liskov

Programmation orientée objet en Python

Principe de substitution de Liskov

 

La classe de base doit être interchangeable avec ses sous-classes sans altérer les propriétés du programme

Syntaxiquement
  • signatures de fonctions compatibles
    • arguments, valeurs retournées
Sémantiquement
  • l'état de l'objet et du programme reste cohérent
    • méthode de sous-classe ne renforce pas les conditions d'entrée
    • méthode de sous-classe ne diminue pas les conditions de sortie
    • pas d'exceptions supplémentaires
Programmation orientée objet en Python

Violation du PSL

Incompatibilité syntaxique

BankAccount.withdraw() nécessite 1 paramètre, mais CheckingAccount.withdraw() en nécessite 2

Renforcement des conditions d'entrée par la sous-classe

BankAccount.withdraw() accepte n'importe quel montant, mais CheckingAccount.withdraw() suppose que le montant est limité

Affaiblissement des conditions de sortie par la sous-classe

BankAccount.withdraw() ne peut laisser qu'un solde positif ou provoquer une erreur, CheckingAccount.withdraw() peut laisser un solde négatif

Programmation orientée objet en Python

Violation du PSL

→ Modification d'attributs supplémentaires dans la méthode de la sous-classe

→ Lancer des exceptions supplémentaires dans la méthode de la sous-classe

Programmation orientée objet en Python

 

 

 

 

$$\text{\textbf{\Huge{Pas de PSL -- Pas d'héritage}}}$$

Programmation orientée objet en Python

Passons à la pratique !

Programmation orientée objet en Python

Preparing Video For Download...