Python Academy · Lektion

Klassmönster

Matcha mot objektattribut

Lektion 3 av 413 steg

Klassmönster är en gratis lektion i Python Academy på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Python Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Python Academy innehåller totalt 4 lektioner.

Matcha objekt

Klassmönster låter match kontrollera typen för ett objekt och hämta ut dess attribut i ett enda steg. De ser ut som ett konstruktoranrop inuti ett fall.

Kontrollera endast typen

Ett klassmönster med tomma parenteser matchar alla instanser 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]))

Fånga attribut med namn

Skriv attr=name inom parenteserna för att matcha instanser och binda det namngivna attributet till 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)

Matcha specifika attributvärden

Ni kan kräva att ett attribut är lika med ett literalvärde. Det här fallet matchar endast punkter som ligger på x-axeln.

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önster med __match_args__

Om en klass definierar __match_args__ kan ni matcha attribut efter position. Dataclasses ställer automatiskt in detta utifrån fältens ordning.

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

p = Point(3, 4)

match p:
    case Point(px, py):
        print(px, py)

Definiera __match_args__ manuellt

För en vanlig klass anger ni __match_args__ som en tupel med namnen på de attribut som ska vara tillgängliga 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)

Dispatchning efter klass

Klassmönster ger en tydlig dispatcher över en grupp relaterade typer, där varje typ hanteras av sitt eget fall.

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

Nästla klassmönster

Klassmönster kan nästlas. Ett fält som själv är ett objekt kan matchas med ett annat klassmö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)

Kombinera med inbyggda typer

Inbyggda typer stöder ett enda positionellt argument som fångar värdet. int(n) matchar ett heltal och binder det till 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 klassmönster ska användas

Använd klassmönster när ni arbetar med objekt där både typen och attributvärdena styr logiken, till exempel händelseobjekt, AST-noder eller formhierarkier. De ersätter utförliga isinstance-kontroller tillsammans med attributåtkomst.

Blanda positionella och namngivna mönster

Ni kan blanda positionella delmönster och delmönster med nyckelord i ett klassmönster, precis som vid ett funktionsanrop. De positionella använder ordningen i __match_args__, medan de med nyckelord anger attributet uttryckligen.

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)

Snabbtest

Vad matchar mönstret Point(x=0, y=y)?

Sammanfattning

Ni har lärt er att matcha objektattribut.

  • ClassName() kontrollerar typen.
  • attr=name binder attribut; literalvärden kräver exakta värden.
  • __match_args__ aktiverar positionsmatchning.
  • Klassmönster kan nästlas och användas för dispatchning över typhierarkier.
Gratis att börja

Lär dig Python med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
76
Lektioner
320

Vanliga frågor

Är lektionen ”Klassmönster” gratis?

Ja – hela texten till ”Klassmönster” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Python Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Python Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Klassmönster”?

Matcha mot objektattribut Ni övar på Python Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Python Academy?

Du behöver inga förkunskaper. Utbildningen i Python Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.

Hur lång tid tar lektionen ”Klassmönster”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Python Academy-lektionen?

Ja. Varje Python Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Grunderna i match och case
  2. Matchning av sekvenser och mappningar
  3. Klassmönster
  4. Vaktvillkor och jokertecken
← Tillbaka till Python Academy