0Pricing
Python Academy · Lekcja

Polimorfizm i kaczego typowanie

Proszę pisać polimorficzny kod działający z dowolnym zgodnym obiektem.

Polimorfizm i kaczego typowanie to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Python Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Python Academy zawiera 4 lekcji w sumie.

Wprowadzenie

Polimorfizm pozwala różnym obiektom reagować na ten sam interfejs. Duck typing oznacza: jeśli coś zachowuje się jak kaczka, jest traktowane jak kaczka.

Czym jest polimorfizm?

Polimorfizm oznacza „wiele postaci”. Ta sama nazwa metody działa różnie dla różnych obiektów. Python intensywnie wykorzystuje tę koncepcję.
class Cat:
    def speak(self): return 'Meow'
class Dog:
    def speak(self): return 'Woof'
for animal in [Cat(), Dog()]:
    print(animal.speak())

Duck typing

Python nie wymaga hierarchii klas, aby obsługiwać polimorfizm. Jeśli obiekt ma odpowiednią metodę, można go użyć. Interfejsy nie są potrzebne.
class Duck:
    def quack(self): return 'Quack'
class Person:
    def quack(self): return 'I am quacking like a duck'
def make_it_quack(duck):
    print(duck.quack())
make_it_quack(Duck())
make_it_quack(Person())

Funkcje polimorficzne

len() działa na napisach, listach, słownikach i krotkach — ponieważ wszystkie implementują __len__. To przykład wbudowanego polimorfizmu.
for obj in ['hello', [1,2,3], {'a':1}]:
    print(type(obj).__name__, len(obj))

Przeciążanie operatorów

+ działa na liczbach całkowitych, liczbach zmiennoprzecinkowych, napisach i listach, ponieważ każdy z tych typów implementuje __add__ w inny sposób.
print(1 + 2)        # int addition
print('a' + 'b')    # string concat
print([1] + [2])    # list concat

Duck typing oparty na protokole

Protokół iteracji: każdy obiekt mający __iter__ i __next__ działa w pętlach for — nie jest potrzebna klasa bazowa.
class Squares:
    def __init__(self, n): self.n,self.i=n,0
    def __iter__(self): return self
    def __next__(self):
        if self.i>=self.n: raise StopIteration
        x=self.i**2; self.i+=1; return x
print(list(Squares(5)))

EAFP a LBYL

EAFP (łatwiej prosić o wybaczenie niż o pozwolenie) korzysta z try/except. LBYL (sprawdź, zanim wykonasz) korzysta z if/hasattr. Python preferuje EAFP.
# LBYL:
if hasattr(obj, 'quack'):
    obj.quack()
# EAFP (Pythonic):
try:
    'hello'.quack()
except AttributeError:
    print('no quack')

isinstance() do bezpiecznego wyboru obsługi

Gdy potrzebne jest zachowanie zależne od typu, isinstance() jest czytelniejszy niż przechwytywanie AttributeError.
def process(data):
    if isinstance(data, str):
        return data.upper()
    elif isinstance(data, list):
        return [x*2 for x in data]
print(process('hi'))
print(process([1,2,3]))

Abstrakcyjne klasy bazowe jako protokoły

from abc import ABC, abstractmethod definiuje formalne protokoły. Klasy pochodne muszą implementować metody abstrakcyjne.
from abc import ABC, abstractmethod
class Drawable(ABC):
    @abstractmethod
    def draw(self): pass
class Circle(Drawable):
    def draw(self): print('O')
Circle().draw()

typing.Protocol (3.8+)

class MyProtocol(Protocol): definiuje typowanie strukturalne bez użycia ABC. Działa z mypy podczas sprawdzania statycznego.
from typing import Protocol
class Quackable(Protocol):
    def quack(self) -> str: ...
def make_quack(x: Quackable) -> str:
    return x.quack()
print('protocol demo')

Polimorfizm w praktyce

Należy projektować interfejsy API tak, aby przyjmowały dowolny obiekt z odpowiednim interfejsem. Dzięki temu kod można rozszerzać bez jego modyfikowania.
class JSONSerializer:
    def serialize(self, obj): import json; return json.dumps(obj)
class XMLSerializer:
    def serialize(self, obj): return f'<data>{obj}</data>'
def export(data, serializer):
    return serializer.serialize(data)
print(export({'x': 1}, JSONSerializer()))

Szybkie sprawdzenie

Co oznacza duck typing w Pythonie?

Podsumowanie

Polimorfizm: ten sam interfejs, różne zachowanie. Duck typing: liczy się zachowanie, a nie typ. Protokoły nieformalnie definiują interfejsy. EAFP (try/except) to typowo pythonowe podejście.

Proszę kontynuować

Doskonale Państwu idzie! Proszę kontynuować naukę, aby opanować kolejne zagadnienie.

Często zadawane pytania

Czy lekcja „Polimorfizm i kaczego typowanie” jest bezpłatna?

Tak — pełny tekst „Polimorfizm i kaczego typowanie” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Python Academy, przejdź na CoddyKit PRO. Kurs Python Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Polimorfizm i kaczego typowanie”?

Proszę pisać polimorficzny kod działający z dowolnym zgodnym obiektem. Ćwiczysz Python Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Python Academy?

Nie wymagamy żadnego doświadczenia. Python Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Polimorfizm i kaczego typowanie”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Python Academy?

Tak. Każda lekcja Python Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Dziedziczenie pojedyncze
  2. Przesłanianie metod i super()
  3. Dziedziczenie wielokrotne i MRO
  4. Polimorfizm i kaczego typowanie
← Powrót do Python Academy