Menu
Coddy logo textTech

Typowanie kacze

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

Kaczkowe typowanie skupia się na tym, co obiekt potrafi zrobić, a nie na tym, czym jest. Jeśli obiekt ma potrzebne Ci metody, możesz go użyć — niezależnie od jego klasy.

Oto dwie niezwiązane ze sobą klasy z tymi samymi metodami:

class Duck:
    def swim(self):
        return "Duck swimming"
    
    def quack(self):
        return "Quack!"

class Person:
    def swim(self):
        return "Person swimming"
    
    def quack(self):
        return "Person imitating a duck: Quack!"

Zauważ, że klasy Duck i Person nie dziedziczą po tej samej klasie nadrzędnej, ale obie mają metody swim() i quack().

Utwórz funkcję, która działa z dowolnym obiektem „podobnym do kaczki”:

def make_it_swim_and_quack(duck_like_object):
    print(duck_like_object.swim())
    print(duck_like_object.quack())

Ta funkcja nie przejmuje się typem obiektu — interesuje ją tylko to, czy obiekt ma wymagane metody.

Użyj funkcji z obiema klasami:

make_it_swim_and_quack(Duck())
make_it_swim_and_quack(Person())

Wynik:

Duck swimming
Quack!
Person swimming
Person imitating a duck: Quack!

Dodaj kolejną klasę „podobną do kaczki”:

class Robot:
    def swim(self):
        return "Robot swimming with propellers"
    
    def quack(self):
        return "Robot sound: BEEP BEEP!"

make_it_swim_and_quack(Robot())

Wynik:

Robot swimming with propellers
Robot sound: BEEP BEEP!

Najważniejsza kwestia: typowanie kacze umożliwia polimorfizm bez dziedziczenia. Jeśli obiekt ma potrzebne metody, możesz go użyć. Dzięki temu kod w Pythonie jest elastyczny i zgodny z zasadą „łatwiej prosić o wybaczenie niż o pozwolenie”.

challenge icon

Wyzwanie

Średni

W tym wyzwaniu zaimplementujesz system demonstrujący typowanie kaczego z różnymi obiektami przypominającymi pliki:

  • textfile.py: Zaimplementuj klasę TextFile z metodami read() i write(data)
  • database.py: Zaimplementuj klasę Database z pasującymi sygnaturami metod
  • networkresource.py: Zaimplementuj klasę NetworkResource z pasującymi sygnaturami metod
  • driver.py - Zaimplementuj przypadki testowe, które sprawdzą, czy Twoja implementacja działa poprawnie

Każdy plik zawiera szczegółowe komentarze TODO, które pomogą Ci w implementacji.

Spróbuj swoich sił

# TODO: Zaimportuj klasę TextFile z textfile.py
# TODO: Zaimportuj klasę Database z database.py
# TODO: Zaimportuj klasę NetworkResource z networkresource.py

def process_data(data_source, data):
    # TODO: Wywołaj metodę read() na data_source i wypisz wynik
    # TODO: Wywołaj metodę write(data) na data_source i wypisz wynik
    pass


# Test z różnymi źródłami danych — NIE MODYFIKUJ TEGO KODU TESTOWEGO
text_file = TextFile()
database = Database()
network = NetworkResource()

print("Processing text file:")
process_data(text_file, "Hello, world!")

print("\
Processing database:")
process_data(database, "User record")

print("\
Processing network resource:")
process_data(network, "GET request")
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