Personnaliser les fonctionnalités via l’héritage

Introduction à la programmation orientée objet en Python

George Boorman

Curriculum Manager, DataCamp

Une hiérarchie de classes de comptes bancaires

Introduction à la programmation orientée objet en Python

Ce que nous avons pour l’instant

class BankAccount:
    def __init__(self, balance):
       self.balance = balance

    def withdraw(self, amount):
       self.balance -=amount

# Classe vide héritée de BankAccount
class SavingsAccount(BankAccount):
    pass
Introduction à la programmation orientée objet en Python

Personnaliser les constructeurs

class SavingsAccount(BankAccount):    
    # Constructeur de SavingsAccount avec un argument supplémentaire
    def __init__(self, balance, interest_rate):  

# Appeler le constructeur parent via ClassName.__init__() # self est un SavingsAccount mais aussi un BankAccount BankAccount.__init__(self, balance)
# Ajouter plus de fonctionnalités self.interest_rate = interest_rate
  • Exécuter d’abord le constructeur parent avec Parent.__init__(self, args...)
  • Ajouter des fonctionnalités
  • N’êtes pas obligé d’appeler le constructeur parent
Introduction à la programmation orientée objet en Python

Créer des objets avec un constructeur personnalisé

# Construire l’objet avec le nouveau constructeur
acct = SavingsAccount(1000, 0.03)
acct.interest_rate
0.03
Introduction à la programmation orientée objet en Python

Ajouter des fonctionnalités

  • Ajouter des méthodes comme d’habitude
  • Peut utiliser les données du parent et de l’enfant
class SavingsAccount(BankAccount):
    def __init__(self, balance, interest_rate):
        BankAccount.__init__(self, balance)
        self.interest_rate = interest_rate

    # Nouvelle fonctionnalité
    def compute_interest(self, n_periods=1):
        return self.balance * ( (1 + self.interest_rate) ** n_periods - 1)
Introduction à la programmation orientée objet en Python

Une hiérarchie de classes de comptes bancaires

Introduction à la programmation orientée objet en Python

Ajouter une deuxième classe fille

class CheckingAccount(BankAccount):

def __init__(self, balance, limit): BankAccount.__init__(self, balance) # Appeler le constructeur ParentClass self.limit = limit
def deposit(self, amount): self.balance += amount
def withdraw(self, amount, fee=0): # Nouvel argument fee
if amount <= self.limit: BankAccount.withdraw(self, amount + fee) else: pass # Ne s’exécute pas si la condition n’est pas remplie
Introduction à la programmation orientée objet en Python
check_acct = CheckingAccount(1000, 25)

# Appelle withdraw de CheckingAccount
check_acct.withdraw(200)

# Appelle withdraw de CheckingAccount check_acct.withdraw(200, fee=15)
bank_acct = BankAccount(1000)

# Appelle withdraw de BankAccount
bank_acct.withdraw(200)

# Provoquera une erreur bank_acct.withdraw(200, fee=15)
TypeError: withdraw() got an unexpected
keyword argument 'fee'
  • Viole le polymorphisme
    • Les classes parent/enfant ont des méthodes différentes
Introduction à la programmation orientée objet en Python

Passons à la pratique !

Introduction à la programmation orientée objet en Python

Preparing Video For Download...