Funktionalität per Vererbung anpassen

Einführung in objektorientierte Programmierung in Python

George Boorman

Curriculum Manager, DataCamp

Eine Hierarchie von Bankkonto-Klassen

Einführung in objektorientierte Programmierung in Python

Stand bisher

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

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

# Leere Klasse, geerbt von BankAccount
class SavingsAccount(BankAccount):
    pass
Einführung in objektorientierte Programmierung in Python

Konstruktoren anpassen

class SavingsAccount(BankAccount):    
    # Konstruktor für SavingsAccount mit zusätzlichem Argument
    def __init__(self, balance, interest_rate):  

# Elternkonstruktor mit ClassName.__init__() aufrufen # self ist ein SavingsAccount, aber auch ein BankAccount BankAccount.__init__(self, balance)
# Mehr Funktionalität hinzufügen self.interest_rate = interest_rate
  • Zuerst Elternkonstruktor per Parent.__init__(self, args...) aufrufen
  • Mehr Funktionalität hinzufügen
  • Elternkonstruktor muss nicht aufgerufen werden
Einführung in objektorientierte Programmierung in Python

Objekte mit angepasstem Konstruktor erstellen

# Objekt mit dem neuen Konstruktor erzeugen
acct = SavingsAccount(1000, 0.03)
acct.interest_rate
0.03
Einführung in objektorientierte Programmierung in Python

Funktionalität hinzufügen

  • Methoden wie üblich hinzufügen
  • Daten aus Eltern- und Kindklasse nutzbar
class SavingsAccount(BankAccount):
    def __init__(self, balance, interest_rate):
        BankAccount.__init__(self, balance)
        self.interest_rate = interest_rate

    # Neue Funktionalität
    def compute_interest(self, n_periods=1):
        return self.balance * ( (1 + self.interest_rate) ** n_periods - 1)
Einführung in objektorientierte Programmierung in Python

Eine Hierarchie von Bankkonto-Klassen

Einführung in objektorientierte Programmierung in Python

Zweite Kindklasse hinzufügen

class CheckingAccount(BankAccount):

def __init__(self, balance, limit): BankAccount.__init__(self, balance) # Eltern-Konstruktor aufrufen self.limit = limit
def deposit(self, amount): self.balance += amount
def withdraw(self, amount, fee=0): # Neues Argument fee
if amount <= self.limit: BankAccount.withdraw(self, amount + fee) else: pass # Läuft nicht, wenn die Bedingung nicht erfüllt ist
Einführung in objektorientierte Programmierung in Python
check_acct = CheckingAccount(1000, 25)

# Ruft withdraw aus CheckingAccount auf
check_acct.withdraw(200)

# Ruft withdraw aus CheckingAccount auf check_acct.withdraw(200, fee=15)
bank_acct = BankAccount(1000)

# Ruft withdraw aus BankAccount auf
bank_acct.withdraw(200)

# Führt zu einem Fehler bank_acct.withdraw(200, fee=15)
TypeError: withdraw() got an unexpected
keyword argument 'fee'
  • Verletzt Polymorphie
    • Eltern-/Kindklassen haben unterschiedliche Methoden
Einführung in objektorientierte Programmierung in Python

Lass uns üben!

Einführung in objektorientierte Programmierung in Python

Preparing Video For Download...