Personalizzare le funzionalità tramite ereditarietà

Programmazione orientata agli oggetti in Python

Alex Yarosh

Content Quality Analyst @ DataCamp

una gerarchia di classi account

Programmazione orientata agli oggetti in Python

Cosa abbiamo finora

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

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

# Classe vuota ereditata da BankAccount
class SavingsAccount(BankAccount):
    pass
Programmazione orientata agli oggetti in Python

Personalizzare i costruttori

class SavingsAccount(BankAccount):    

    # Costruttore specifico per SavingsAccount con un parametro aggiuntivo
    def __init__(self, balance, interest_rate):  

# Chiama il costruttore del genitore usando ClassName.__init__() BankAccount.__init__(self, balance) # <--- self è un SavingsAccount ma anche un BankAccount
# Aggiungi più funzionalità self.interest_rate = interest_rate
  • Puoi eseguire prima il costruttore del genitore con Parent.__init__(self, args...)
  • Aggiungi più funzionalità
  • Non devi chiamare i costruttori del genitore
Programmazione orientata agli oggetti in Python

Crea oggetti con un costruttore personalizzato

# Costruisci l'oggetto usando il nuovo costruttore
acct = SavingsAccount(1000, 0.03)
acct.interest_rate
0.03
Programmazione orientata agli oggetti in Python

Aggiungere funzionalità

  • Aggiungi metodi come al solito
  • Puoi usare i dati sia della classe genitore che di quella figlia
class SavingsAccount(BankAccount):    

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

  # Nuova funzionalità
  def compute_interest(self, n_periods = 1):
     return self.balance * ( (1 + self.interest_rate) ** n_periods - 1)

Programmazione orientata agli oggetti in Python

una gerarchia di classi account

Programmazione orientata agli oggetti in Python

Personalizzare le funzionalità

class CheckingAccount(BankAccount):

def __init__(self, balance, limit): BankAccount.__init__(self, balance) self.limit = limit
def deposit(self, amount): self.balance += amount
def withdraw(self, amount, fee=0):
if fee <= self.limit: BankAccount.withdraw(self, amount + fee) else: BankAccount.withdraw(self, amount + self.limit)
  • Puoi cambiare la firma (aggiungere parametri)
  • Usa Parent.method(self, args...) per chiamare un metodo della classe genitore
Programmazione orientata agli oggetti in Python
check_acct = CheckingAccount(1000, 25)

# Chiamerà withdraw da CheckingAccount
check_acct.withdraw(200)
# Chiamerà withdraw da CheckingAccount
check_acct.withdraw(200, fee=15)
bank_acct = BankAccount(1000)

# Chiamerà withdraw da BankAccount
bank_acct.withdraw(200)
# Genererà un errore
bank_acct.withdraw(200, fee=15)
TypeError: withdraw() ha ricevuto un argomento
 imprevisto 'fee'
Programmazione orientata agli oggetti in Python

Facciamo pratica!

Programmazione orientata agli oggetti in Python

Preparing Video For Download...