Klassemønstre
Match mod objektattributter
Klassemønstre er en gratis Python Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Python Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Python Academy-kurset indeholder 4 lektioner i alt.
Matchning af objekter
Klassemønstre lader match kontrollere typen af et objekt og trække dets attributter ud i ét trin. De ligner et konstruktørkald inde i en case.
Kontrol kun af type
Et klassemønster med tomme parenteser matcher enhver instans af klassen.
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]))Indfangning af attributter efter navn
Skriv attr=name i parenteserne for at matche instanser og binde den navngivne attribut til en variabel.
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)Matchning af bestemte attributværdier
Du kan kræve, at en attribut er lig med en literal. Denne case matcher kun punkter, der ligger på x-aksen.
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)))Positionsmønstre med __match_args__
Hvis en klasse definerer __match_args__, kan du matche attributter efter position. Dataclasses indstiller dette automatisk ud fra felternes rækkefølge.
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
p = Point(3, 4)
match p:
case Point(px, py):
print(px, py)Definér __match_args__ manuelt
For en almindelig klasse skal du sætte __match_args__ til en tuple, der angiver navnene på de attributter, du vil gøre tilgængelige efter position.
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)Fordeling baseret på klasse
Klassemønstre gør det nemt at fordele behandlingen af en familie af beslægtede typer, hvor hver type håndteres af sin egen case.
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)))Indlejrede klassemønstre
Klassemønstre kan indlejres. Et felt, der selv er et objekt, kan matches med et andet klassemønster.
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)Kombination med indbyggede typer
Indbyggede typer understøtter ét positionsargument, der indfanger værdien. int(n) matcher en int og binder den til 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'))Hvornår skal du bruge klassemønstre
Brug klassemønstre, når både objekternes type og attributværdier styrer logikken, for eksempel med hændelsesobjekter, AST-noder eller formhierarkier. De erstatter omstændelige isinstance-kontroller kombineret med attributadgang.
Kombination af positioner og nøgleord
Du kan kombinere underordnede positions- og nøgleordsmønstre i ét klassemønster, ligesom ved et funktionskald. Positionsmønstre bruger rækkefølgen i __match_args__, mens nøgleordsmønstre angiver attributten eksplicit.
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)Hurtig kontrol
Hvad matcher mønstret Point(x=0, y=y)?
Opsummering
Du har lært at matche objekters attributter.
ClassName()kontrollerer typen.attr=namebinder attributter; literaler kræver præcise værdier.__match_args__muliggør positionsmatchning.- Klassemønstre kan indlejres og fordele behandlingen på tværs af typehierarkier.
Lær Python med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 76
- Lektioner
- 320
Ofte stillede spørgsmål
Er lektionen “Klassemønstre” gratis?
Ja — hele teksten til “Klassemønstre” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Python Academy-kurset, skal du opgradere til CoddyKit PRO. Python Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Klassemønstre”?
Match mod objektattributter Du øver dig i Python Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Python Academy?
Der kræves ingen tidligere erfaring. Python Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “Klassemønstre”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Python Academy-lektion?
Ja. Alle Python Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.