Personalizzazione della funzionalità tramite ereditarietà

Introduzione alla programmazione orientata agli oggetti in Python

George Boorman

Curriculum Manager, DataCamp

Una gerarchia di classi di conto bancario

Introduzione alla programmazione orientata agli oggetti in Python

Ciò che abbiamo finora

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

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

# Empty class inherited from BankAccount
class SavingsAccount(BankAccount):
    pass
Introduzione alla programmazione orientata agli oggetti in Python

Personalizzazione dei costruttori

class SavingsAccount(BankAccount):    
    # Constructor for SavingsAccount with an additional argument
    def __init__(self, balance, interest_rate):  

# Call the parent constructor using ClassName.__init__() # self is a SavingsAccount but also a BankAccount BankAccount.__init__(self, balance)
# Add more functionality self.interest_rate = interest_rate
  • Può eseguire prima il costruttore della classe padre tramite Parent.__init__(self, args...)
  • Aggiungi più funzionalità
  • Non è necessario chiamare il costruttore padre
Introduzione alla programmazione orientata agli oggetti in Python

Crea oggetti con un costruttore personalizzato

# Construct the object using the new constructor
acct = SavingsAccount(1000, 0.03)
acct.interest_rate
0.03
Introduzione alla programmazione orientata agli oggetti in Python

Aggiunta di funzionalità

  • Aggiungi metodi come di consueto
  • Può usare i dati sia della classe padre sia della classe figlia
class SavingsAccount(BankAccount):
    def __init__(self, balance, interest_rate):
        BankAccount.__init__(self, balance)
        self.interest_rate = interest_rate

    # New functionality
    def compute_interest(self, n_periods=1):
        return self.balance * ( (1 + self.interest_rate) ** n_periods - 1)
Introduzione alla programmazione orientata agli oggetti in Python

Una gerarchia di classi di conto bancario

Introduzione alla programmazione orientata agli oggetti in Python

Aggiunta di una seconda classe figlia

class CheckingAccount(BankAccount):

def __init__(self, balance, limit): BankAccount.__init__(self, balance) # Call the ParentClass constructor self.limit = limit
def deposit(self, amount): self.balance += amount
def withdraw(self, amount, fee=0): # New fee argument
if amount <= self.limit: BankAccount.withdraw(self, amount + fee) else: pass # Won't run if the condition isn't met
Introduzione alla programmazione orientata agli oggetti in Python
check_acct = CheckingAccount(1000, 25)

# Will call withdraw from CheckingAccount
check_acct.withdraw(200)

# Will call withdraw from CheckingAccount check_acct.withdraw(200, fee=15)
bank_acct = BankAccount(1000)

# Will call withdraw from BankAccount
bank_acct.withdraw(200)

# Will produce an error bank_acct.withdraw(200, fee=15)
TypeError: withdraw() got an unexpected
keyword argument 'fee'
  • Viola il polimorfismo
    • Le classi padre/figlio hanno metodi diversi
Introduzione alla programmazione orientata agli oggetti in Python

Passiamo alla pratica!

Introduzione alla programmazione orientata agli oggetti in Python

Preparing Video For Download...