クラスパターン
オブジェクトの属性に対してマッチングします
「クラスパターン」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。
オブジェクトとのマッチング
クラスパターンを使うと、matchでオブジェクトの型を確認し、その属性を一度に取り出せます。caseの中では、コンストラクター呼び出しのように見えます。
型だけを確認する
空のかっこを持つクラスパターンは、そのクラスの任意のインスタンスにマッチします。
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]))名前による属性のキャプチャ
かっこの中にattr=nameと書くと、インスタンスにマッチさせ、その名前付き属性を変数に束縛できます。
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)特定の属性値とのマッチング
属性がリテラルと等しいことを条件にできます。このcaseは、x軸上にある点にだけマッチします。
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)))__match_args__による位置指定パターン
クラスが__match_args__を定義していれば、属性を位置で指定してマッチさせられます。データクラスでは、フィールドの順序からこれが自動的に設定されます。
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__を手動で定義する
通常のクラスでは、位置指定で利用したい属性の名前をタプルにして__match_args__に設定します。
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)クラスによるディスパッチ
クラスパターンを使うと、関連する型の集合に対するディスパッチャーをすっきり記述でき、それぞれを専用の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)))クラスパターンのネスト
クラスパターンはネストできます。フィールド自体がオブジェクトの場合も、別のクラスパターンでマッチさせられます。
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)組み込み型との組み合わせ
組み込み型は、値をキャプチャする1つの位置引数に対応しています。int(n)はintにマッチし、その値を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'))クラスパターンを使う場面
オブジェクトの型と属性値の両方がロジックを決める場合は、クラスパターンを使うとよいでしょう。たとえば、イベントオブジェクト、ASTノード、図形の階層などです。冗長なisinstanceの確認と属性アクセスの組み合わせを置き換えられます。
位置指定とキーワード指定の組み合わせ
関数呼び出しと同じように、1つのクラスパターン内で位置指定のサブパターンとキーワード指定のサブパターンを組み合わせられます。位置指定では__match_args__の順序を使い、キーワード指定では属性名を明示します。
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)確認問題
パターンPoint(x=0, y=y)は何にマッチしますか?
まとめ
オブジェクトの属性に基づいてマッチさせる方法を学びました。
ClassName()は型を確認します。attr=nameは属性を束縛し、リテラルは完全に一致する値を要求します。__match_args__によって位置指定のマッチングが可能になります。- クラスパターンはネストでき、型の階層に対するディスパッチにも利用できます。
よくある質問
「クラスパターン」レッスンは無料ですか?
はい。「クラスパターン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。
「クラスパターン」で何を学びますか?
オブジェクトの属性に対してマッチングします ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Python Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「クラスパターン」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPython Academyレッスンでコードを書いて実行できますか?
はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。