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”.
Wyzwanie
ŚredniW tym wyzwaniu zaimplementujesz system demonstrujący typowanie kaczego z różnymi obiektami przypominającymi pliki:
textfile.py: Zaimplementuj klasęTextFilez metodamiread()iwrite(data)database.py: Zaimplementuj klasęDatabasez pasującymi sygnaturami metodnetworkresource.py: Zaimplementuj klasęNetworkResourcez pasującymi sygnaturami metoddriver.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")Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektyParametr selfMetodyAtrybutyMetoda konstruktora (__init__)Powtórzenie – prosty kalkulator4Dziedziczenie
Podstawy dziedziczeniaFunkcja super()Nadpisywanie metodDziedziczenie wielokrotneKolejność rozwiązywania metodPodsumowanie – hierarchia pracowników7Metody specjalne
Wprowadzenie do metod magicznychPrzeciążanie operatorówMagiczne metody kontenerówPowtórka – własna lista10Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy2Dekoratory
Wprowadzenie do dekoratorówDekorator propertyDekorator metody statycznejDekorator metody klasowej5Polimorfizm
Ponowne omówienie nadpisywania metodTypowanie kaczeKlasy i metody abstrakcyjneProjektowanie interfejsówPodsumowanie — kalkulator kształtów8Zaawansowane koncepcje programowania obiektowego
Kompozycja a dziedziczenieMiksyMetody statyczne i klasoweDekoratory klasMenedżery kontekstu11Wzorce projektowe, część 2
Wzorzec PolecenieWzorzec AdapterWzorzec DekoratorWzorzec Metoda szablonowaWzorzec StanWzorzec Kompozyt3Właściwości klas
Zmienne instancji a zmienne klasoweDekoratory właściwościAtrybuty prywatnePowtórzenie — menedżer kont bankowych6Hermetyzacja
Public, Protected, Private — pamięćModyfikatory dostępuUkrywanie informacjiDekoratory właściwości — zaawansowanePodsumowanie — system ewidencji uczniów12Projekt: System zarządzania biblioteką
Przegląd projektuKlasy Book i UserSystem wypożyczeńFunkcja wyszukiwaniaInterfejs administratoraTestowanie i integracjaPoćwicz samodzielnie: Kompilator Python online