Python Academy · Lektion

Klassemønstre

Match mod objektattributter

Lektion 3 af 413 trin

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=name binder 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.
Gratis at komme i gang

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.

Alle lektioner i dette kursus

  1. Grundlæggende om match og case
  2. Matchning af sekvenser og mappings
  3. Klassemønstre
  4. Guards og wildcards
← Tilbage til Python Academy