Klassepatronen
Match op objectattributen
Klassepatronen is een gratis Python Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Python Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Python Academy bevat in totaal 4 lessen.
Objecten matchen
Klassepatronen laten match het type van een object controleren en de attributen ervan in één stap uitlezen. Ze zien eruit als een constructoraanroep binnen een case.
Alleen het type controleren
Een klassepatroon met lege haakjes matcht elk exemplaar van die klasse.
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]))Attributen op naam vastleggen
Schrijf binnen de haakjes attr=name om exemplaren te matchen en het benoemde attribuut aan een variabele te koppelen.
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)Specifieke attribuutwaarden matchen
U kunt vereisen dat een attribuut gelijk is aan een letterlijke waarde. Deze case matcht alleen punten die op de x-as liggen.
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)))Positionele patronen met __match_args__
Als een klasse __match_args__ definieert, kunt u attributen positioneel matchen. Dataklassen stellen dit automatisch in op basis van de volgorde van hun velden.
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
p = Point(3, 4)
match p:
case Point(px, py):
print(px, py)__match_args__ handmatig definiëren
Stel voor een gewone klasse __match_args__ in op een tuple met de namen van de attributen die u positioneel beschikbaar wilt maken.
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)Verdelen op klasse
Klassepatronen vormen een duidelijke verdeler voor een reeks verwante typen, waarbij elke case zijn eigen type verwerkt.
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)))Klassepatronen nesten
Klassepatronen kunnen worden genest. Een veld dat zelf een object is, kan met een ander klassepatroon worden gematcht.
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)Combineren met ingebouwde typen
Ingebouwde typen ondersteunen één positioneel argument dat de waarde vastlegt. int(n) matcht een int en koppelt deze aan 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'))Wanneer u klassepatronen gebruikt
Gebruik klassepatronen wanneer zowel het type als de attribuutwaarden van objecten de logica bepalen, bijvoorbeeld bij gebeurtenisobjecten, AST-knooppunten of vormhiërarchieën. Ze vervangen omslachtige isinstance-controles in combinatie met attribuuttoegang.
Positioneel en benoemd combineren
U kunt positionele en benoemde subpatronen in één klassepatroon combineren, net als bij een functieaanroep. Positionele patronen gebruiken de volgorde van __match_args__; benoemde patronen noemen het attribuut expliciet.
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)Korte controle
Waarmee matcht het patroon Point(x=0, y=y)?
Samenvatting
U hebt geleerd te matchen op objectattributen.
ClassName()controleert het type.attr=namekoppelt attributen aan namen; letterlijke waarden vereisen exacte overeenkomsten.__match_args__maakt positioneel matchen mogelijk.- Klassepatronen kunnen worden genest en over typehiërarchieën worden verdeeld.
Leer Python met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 76
- Lessen
- 320
Veelgestelde vragen
Is de les “Klassepatronen” gratis?
Ja — de volledige tekst van “Klassepatronen” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Python Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Python Academy bevat in totaal 4 lessen.
Wat leer ik in “Klassepatronen”?
Match op objectattributen Je oefent met Python Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Python Academy te beginnen?
Ervaring vooraf is niet nodig. Python Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.
Hoe lang duurt de les “Klassepatronen”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Python Academy?
Ja. Elke les over Python Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.