Wzorce klas
Dopasowuj wzorce do atrybutów obiektów
Wzorce klas to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 3 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.
Dopasowywanie obiektów
Wzorce klas pozwalają instrukcji match sprawdzić typ obiektu i jednocześnie wyodrębnić jego atrybuty. Wyglądają jak wywołanie konstruktora umieszczone wewnątrz przypadku.
Sprawdzanie wyłącznie typu
Wzorzec klasy z pustymi nawiasami pasuje do każdej instancji tej klasy.
def kind(value):
match value:
case int():
return 'an integer'
case str():
return 'a string'
case _:
return 'something else'
print(kind(5))
print(kind('hi'))
print(kind([1]))Przechwytywanie atrybutów po nazwie
W nawiasach należy zapisać attr=name, aby dopasować instancje i przypisać nazwany atrybut do zmiennej.
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
p = Point(3, 4)
match p:
case Point(x=px, y=py):
print('point at', px, py)Dopasowywanie konkretnych wartości atrybutów
Można wymagać, aby atrybut był równy literałowi. Ten przypadek pasuje wyłącznie do punktów leżących na osi x.
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
def describe(p):
match p:
case Point(x=0, y=0):
return 'origin'
case Point(x=x, y=0):
return 'on x-axis at ' + str(x)
case Point():
return 'elsewhere'
print(describe(Point(0, 0)))
print(describe(Point(5, 0)))
print(describe(Point(1, 1)))Wzorce pozycyjne z __match_args__
Jeśli klasa definiuje __match_args__, można dopasowywać atrybuty pozycyjnie. Dataclasses ustawiają tę wartość automatycznie na podstawie kolejności pól.
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
p = Point(3, 4)
match p:
case Point(px, py):
print(px, py)Ręczne definiowanie __match_args__
W zwykłej klasie należy ustawić __match_args__ na krotkę zawierającą nazwy atrybutów, które mają być dostępne pozycyjnie.
class Point:
__match_args__ = ('x', 'y')
def __init__(self, x, y):
self.x = x
self.y = y
match Point(1, 2):
case Point(a, b):
print(a, b)Rozdzielanie działania według klasy
Wzorce klas pozwalają przejrzyście rozdzielać działanie programu dla rodziny powiązanych typów, z których każdy jest obsługiwany przez własny przypadek.
from dataclasses import dataclass
@dataclass
class Circle:
radius: float
@dataclass
class Square:
side: float
def area(shape):
match shape:
case Circle(radius=r):
return 3.14159 * r * r
case Square(side=s):
return s * s
print(area(Circle(2)))
print(area(Square(3)))Zagnieżdżanie wzorców klas
Wzorce klas można zagnieżdżać. Pole będące obiektem może zostać dopasowane za pomocą kolejnego wzorca klasy.
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
@dataclass
class Line:
start: Point
end: Point
line = Line(Point(0, 0), Point(3, 4))
match line:
case Line(start=Point(x=0, y=0), end=Point(x=ex, y=ey)):
print('from origin to', ex, ey)Łączenie z typami wbudowanymi
Typy wbudowane obsługują jeden argument pozycyjny, który przechwytuje wartość. int(n) dopasowuje wartość typu int i przypisuje ją do n.
def label(value):
match value:
case int(n):
return 'int ' + str(n)
case str(s):
return 'str ' + s
case _:
return 'other'
print(label(7))
print(label('hi'))Kiedy używać wzorców klas
Po wzorce klas warto sięgać podczas pracy z obiektami, których typ i wartości atrybutów wpływają na działanie programu, na przykład z obiektami zdarzeń, węzłami AST lub hierarchiami kształtów. Zastępują one rozwlekłe sprawdzanie isinstance połączone z dostępem do atrybutów.
Łączenie wzorców pozycyjnych i nazwanych
W jednym wzorcu klasy można łączyć podwzorce pozycyjne i nazwane, podobnie jak w wywołaniu funkcji. Wzorce pozycyjne korzystają z kolejności w __match_args__, a wzorce nazwane jawnie wskazują atrybut.
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
z: int
p = Point(1, 2, 3)
match p:
case Point(x, y, z=depth):
print(x, y, depth)Szybkie sprawdzenie
Do czego pasuje wzorzec Point(x=0, y=y)?
Podsumowanie
Nauczyli się Państwo dopasowywać obiekty na podstawie ich atrybutów.
ClassName()sprawdza typ.attr=nameprzypisuje atrybuty do nazw, a literały wymagają dokładnych wartości.__match_args__umożliwia dopasowywanie pozycyjne.- Wzorce klas można zagnieżdżać i wykorzystywać do rozdzielania działania w hierarchiach typów.
Często zadawane pytania
Czy lekcja „Wzorce klas” jest bezpłatna?
Tak — pełny tekst „Wzorce klas” 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 „Wzorce klas”?
Dopasowuj wzorce do atrybutów obiektów Ć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 3 z 4.
Ile czasu zajmuje lekcja „Wzorce klas”?
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.