Menu
Coddy logo textTech

Nadpisywanie metod

Część sekcji Programowanie obiektowe ścieżki Python w Coddy. Lekcja 19 z 64.

Przesłanianie metod pozwala klasie potomnej dostarczyć własną implementację metody, która już istnieje w klasie nadrzędnej.

Oto przykład klasy nadrzędnej z metodami:

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}")

Utwórz klasę potomną, która przesłania jedną metodę:

class Dog(Animal):
    def make_sound(self):
        print("Woof! Woof!")  # Nadpisz metodę klasy nadrzędnej

Metoda make_sound w klasie Dog zastępuje tę z klasy Animal, ale info nadal jest dziedziczona bez zmian.

Utwórz instancje i przetestuj metody:

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

Wywołaj nadpisaną metodę:

animal.make_sound()
dog.make_sound()

Wywołaj metodę, która nie została przesłonięta:

animal.info()
dog.info()

Wynik:

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

Możesz nadpisać dowolną odziedziczoną metodę:

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()

Wynik:

Meow!
I am Whiskers, a sneaky cat

Kluczowa kwestia: Nadpisywanie metod pozwala klasom potomnym dostosowywać odziedziczone zachowanie. Wystarczy zdefiniować metodę o tej samej nazwie w klasie potomnej. Zamiast wersji klasy nadrzędnej zostanie użyta wersja klasy potomnej.

challenge icon

Wyzwanie

Średni

W tym wyzwaniu zaimplementujesz hierarchię kształtów.

  • shape.py — zawiera klasę nadrzędną Shape z atrybutem color i metodami
  • circle.py — zawiera klasę Circle, która dziedziczy po Shape
  • square.py — zawiera klasę Square, która dziedziczy po Shape

Każdy plik zawiera szczegółowe komentarze TODO, które krok po kroku poprowadzą Cię przez implementację.

Spróbuj swoich sił

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

# Obsługa przypadku testowego
test_case = input()

if test_case == "base_shape":
    # Przetestuj klasę bazową Shape
    shape = Shape("green")
    print(f"Color: {shape.color}")
    print(f"Area: {shape.area()}")
    print("Describe output:")
    shape.describe()

elif test_case == "circle_basics":
    # Przetestuj tworzenie obiektów Circle i podstawowe metody
    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":
    # Przetestuj tworzenie obiektów Square i podstawowe metody
    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":
    # Przetestuj wiele obiektów o różnych wymiarach
    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()  # Pusta linia dla czytelności

elif test_case == "shape_polymorphism":
    # Przetestuj zachowanie polimorficzne na liście figur
    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()  # Pusta linia dla czytelności

elif test_case == "original_test_case":
    # Uruchom oryginalny kod testowy z zadania
    circle = Circle("red", 5)
    square = Square("blue", 4)

    # Przetestuj metodę describe
    circle.describe()
    square.describe()

    # Przetestuj metodę area
    print(f"Circle area: {circle.area()}")
    print(f"Square area: {square.area()}")
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Python online