Python Academy · leksjon

Klassemønstre

Sammenlign med attributter på objekter

Leksjon 3 av 413 trinn

Klassemønstre er en gratis leksjon i Python Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Python Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Python Academy inneholder totalt 4 leksjoner.

Matching av objekter

Klassemønstre lar match kontrollere typen til et objekt og hente ut attributtene i ett trinn. De ser ut som et konstruktørkall inne i et tilfelle.

Kontroll bare av typen

Et klassemønster med tomme parenteser samsvarer med enhver instans av den 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]))

Fange attributter etter navn

Skriv attr=name inne i parentesene for å matche instanser og knytte det navngitte attributtet 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)

Matching av bestemte attributtverdier

De kan kreve at et attributt er lik en litteral. Dette tilfellet samsvarer bare med punkter som 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)))

Posisjonelle mønstre med __match_args__

Hvis en klasse definerer __match_args__, kan De matche attributter posisjonelt. Dataclasses setter dette automatisk ut fra feltenes rekkefø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)

Definere __match_args__ manuelt

For en vanlig klasse setter De __match_args__ til en tuppel som navngir attributtene De vil gjøre tilgjengelige posisjonelt.

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 etter klasse

Klassemønstre gir en ryddig måte å fordele arbeidet på tvers av en familie av relaterte typer, der hvert tilfelle håndteres separat.

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)))

Nesting av klassemønstre

Klassemønstre kan nøstes. Et felt som selv er et objekt, kan matches med et annet 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)

Kombinere med innebygde typer

Innebygde typer støtter ett enkelt posisjonelt argument som fanger verdien. int(n) matcher en int og knytter 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'))

Når bør klassemønstre brukes

Bruk klassemønstre når både objektenes type og attributtverdier styrer logikken, for eksempel med hendelsesobjekter, AST-noder eller formhierarkier. De erstatter omstendelige isinstance-kontroller kombinert med attributtilgang.

Blande posisjonelle og navngitte delmønstre

De kan blande posisjonelle og navngitte delmønstre i ett klassemønster, akkurat som i et funksjonskall. Posisjonelle delmønstre bruker rekkefølgen i __match_args__, mens navngitte delmønstre oppgir attributtet eksplisitt.

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)

Kort kontroll

Hva matcher mønsteret Point(x=0, y=y)?

Oppsummering

De har lært å matche mot objektattributter.

  • ClassName() kontrollerer typen.
  • attr=name knytter attributter til navn, mens litteraler krever nøyaktige verdier.
  • __match_args__ muliggjør posisjonell matching.
  • Klassemønstre kan nøstes og brukes til å fordele arbeid i typehierarkier.
Gratis å komme i gang

Lær deg Python med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
76
Leksjoner
320

Ofte stilte spørsmål

Er leksjonen «Klassemønstre» gratis?

Ja – hele teksten i «Klassemønstre» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Python Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Python Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Klassemønstre»?

Sammenlign med attributter på objekter Du øver på Python Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Python Academy?

Ingen tidligere erfaring er nødvendig. Python Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Klassemønstre»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Python Academy-leksjonen?

Ja. Alle Python Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Grunnleggende om match og case
  2. Samsvar med sekvenser og mappinger
  3. Klassemønstre
  4. Vilkår og jokertegn
← Tilbake til Python Academy