Menu
Coddy logo textTech

Methoden überschreiben

Teil des Abschnitts Object Oriented Programming der Python-Journey von Coddy — Lektion 19 von 64.

Das Überschreiben von Methoden ermöglicht es einer Unterklasse, eine eigene Implementierung einer Methode bereitzustellen, die bereits in der Basisklasse vorhanden ist.

Hier ist ein Beispiel für eine Elternklasse mit Methoden:

class Animal:
    def __init__(self, name):
        self.name = name
    
    def make_sound(self):
        print("Some generic animal sound")
    
    def info(self):
        print(f"I am {self.name}")

Erstellen Sie eine Unterklasse, die eine Methode überschreibt:

class Dog(Animal):
    def make_sound(self):
        print("Woof! Woof!")  # Überschreibt die Methode der Elternklasse

Die make_sound-Methode in Dog ersetzt die von Animal, aber info wird weiterhin unverändert geerbt.

Erstellen Sie Instanzen und testen Sie die Methoden:

animal = Animal("Generic Animal")
dog = Dog("Buddy")

Rufen Sie die überschriebene Methode auf:

animal.make_sound()
dog.make_sound()

Rufen Sie die nicht überschriebene Methode auf:

animal.info()
dog.info()

Ausgabe:

Some generic animal sound
Woof! Woof!
I am Generic Animal
I am Buddy

Sie können jede geerbte Methode überschreiben:

class Cat(Animal):
    def make_sound(self):
        print("Meow!")
    
    def info(self):
        print(f"I am {self.name}, a sneaky cat")

cat = Cat("Whiskers")
cat.make_sound()
cat.info()

Ausgabe:

Meow!
I am Whiskers, a sneaky cat

Kernpunkt: Das Überschreiben von Methoden ermöglicht es Kindklassen, vererbtes Verhalten anzupassen. Definieren Sie einfach eine Methode mit demselben Namen in der Kindklasse. Die Version der Kindklasse wird anstelle der Version der Elternklasse verwendet.

challenge icon

Aufgabe

Mittel

In dieser Herausforderung wirst du eine Formenhierarchie implementieren.

  • shape.py - Enthält die übergeordnete Shape-Klasse mit dem Attribut color und Methoden
  • circle.py - Enthält die Klasse Circle, die von Shape erbt
  • square.py - Enthält die Klasse Square, die von Shape erbt

Jede Datei enthält detaillierte TODO-Kommentare, die dich Schritt für Schritt durch die Implementierung führen.

Spickzettel

Methoden-Überschreiben (Method Overriding) ermöglicht es einer Kindklasse, eine eigene Implementierung einer Methode bereitzustellen, die bereits in der Elternklasse existiert.

Beispiel für eine Elternklasse:

class Animal:
    def __init__(self, name):
        self.name = name
    
    def make_sound(self):
        print("Some generic animal sound")
    
    def info(self):
        print(f"I am {self.name}")

Kindklasse, die eine Methode überschreibt:

class Dog(Animal):
    def make_sound(self):
        print("Woof! Woof!")  # Die Elternmethode überschreiben

Die Methode make_sound in Dog ersetzt diejenige von Animal, aber info wird weiterhin unverändert geerbt.

Sie können mehrere Methoden überschreiben:

class Cat(Animal):
    def make_sound(self):
        print("Meow!")
    
    def info(self):
        print(f"I am {self.name}, a sneaky cat")

Wichtiger Punkt: Definieren Sie einfach eine Methode mit demselben Namen in der Kindklasse. Die Version der Kindklasse wird anstelle der Version der Elternklasse verwendet.

Probier es selbst

from shape import Shape
from circle import Circle
from square import Square

# Testfall-Handler
test_case = input()

if test_case == "base_shape":
    # Testet die Basisklasse Shape
    shape = Shape("green")
    print(f"Color: {shape.color}")
    print(f"Area: {shape.area()}")
    print("Describe output:")
    shape.describe()

elif test_case == "circle_basics":
    # Testet die Erstellung von Circle und grundlegende Methoden
    circle = Circle("red", 5)
    print(f"Color: {circle.color}")
    print(f"Radius: {circle.radius}")
    print(f"Area (rounded): {round(circle.area(), 2)}")
    print("Describe output:")
    circle.describe()

elif test_case == "square_basics":
    # Testet die Erstellung von Square und grundlegende Methoden
    square = Square("blue", 4)
    print(f"Color: {square.color}")
    print(f"Side length: {square.side_length}")
    print(f"Area: {square.area()}")
    print("Describe output:")
    square.describe()

elif test_case == "various_sizes":
    # Testet mehrere Instanzen mit unterschiedlichen Dimensionen
    shapes = [
        Circle("yellow", 2),
        Circle("orange", 7.5),
        Square("purple", 3),
        Square("black", 10)
    ]
    
    for i, shape in enumerate(shapes, 1):
        print(f"Shape {i}:")
        shape.describe()
        print(f"Area: {round(shape.area(), 2)}")
        print()  # Leerzeile für die Lesbarkeit

elif test_case == "shape_polymorphism":
    # Testet polymorphes Verhalten mit einer Liste von Formen
    shapes = [
        Shape("white"),
        Circle("red", 3),
        Square("blue", 4)
    ]
    
    print("Polymorphic behavior demonstration:")
    for shape in shapes:
        shape.describe()
        print(f"Area: {round(shape.area(shape_polymorphism), 2)}")
        print()  # Leerzeile für die Lesbarkeit

elif test_case == "original_test_case":
    # Führt den ursprünglichen Testcode aus der Aufgabe aus
    circle = Circle("red", 5)
    square = Square("blue", 4)

    # Testet die describe-Methode
    circle.describe()
    square.describe()

    # Testet die area-Methode
    print(f"Circle area: {circle.area()}")
    print(f"Square area: {square.area()}")
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Object Oriented Programming