Klassmönster
Matcha mot objektattribut
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=namebinder 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.
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
- Grunderna i match och case
- Matchning av sekvenser och mappningar
- Klassmönster
- Vaktvillkor och jokertecken