0Pricing
Python Academy · レッスン

クラスパターン

オブジェクトの属性に対してマッチングします

「クラスパターン」は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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. matchとcaseの基礎
  2. シーケンスとマッピングのマッチング
  3. クラスパターン
  4. ガードとワイルドカード
← Python Academyに戻る