0Pricing
Python Academy · レッスン

Frozenと比較のオプション

変更不可で順序付け可能なデータクラスを作ります

「Frozenと比較のオプション」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

デコレーターのオプション

@dataclassデコレーターは、生成するメソッドを制御するキーワード引数を受け取ります。特に便利なのはfrozenとorderです。

  • frozen=Trueにすると、インスタンスが変更不可能になります。
  • order=Trueにすると、比較演算子が追加されます。

凍結されたデータクラス

frozen=Trueにすると、生成されたクラスは構築後の属性への代入を禁止します。代入しようとするとFrozenInstanceErrorが発生します。

from dataclasses import dataclass, FrozenInstanceError

@dataclass(frozen=True)
class Point:
    x: int
    y: int

p = Point(1, 2)
try:
    p.x = 99
except FrozenInstanceError as e:
    print('Cannot modify:', e)

不変性の利点

不変オブジェクトは扱いやすくなります。作成後に値が変わらないため、関数間やスレッド間で安全に共有できます。また、辞書のキーや集合の要素としても安全に使用できます。

凍結するとハッシュ化可能

凍結データクラスはデフォルトでハッシュ化可能なので、インスタンスを集合の要素や辞書のキーとして使えます。可変データクラスは、明示的に有効にしない限りハッシュ化できません。

from dataclasses import dataclass

@dataclass(frozen=True)
class Point:
    x: int
    y: int

seen = {Point(0, 0), Point(1, 1), Point(0, 0)}
print(len(seen))

凍結された値の置き換え

凍結されたインスタンスは変更できないため、dataclasses.replace()を使って変更後のコピーを作成します。元のインスタンスは変更されません。

from dataclasses import dataclass, replace

@dataclass(frozen=True)
class Point:
    x: int
    y: int

p = Point(1, 2)
q = replace(p, y=99)
print(p)
print(q)

順序付きデータクラス

デフォルトでは、データクラスがサポートするのは==だけです。order=Trueを追加すると、<、<=、>、>=も生成されます。

from dataclasses import dataclass

@dataclass(order=True)
class Version:
    major: int
    minor: int

print(Version(1, 2) < Version(1, 5))
print(Version(2, 0) > Version(1, 9))

順序付けでの比較

順序付けでは、宣言された順序に従ってフィールドを左から右へタプルとして比較します。最初のフィールドが最も重要です。

from dataclasses import dataclass

@dataclass(order=True)
class Version:
    major: int
    minor: int

# major compared first, then minor
print(Version(1, 9) < Version(2, 0))

データクラスインスタンスのソート

順序付きデータクラスでは比較演算子が定義されるため、sorted()を使ってリストを直接ソートできます。

from dataclasses import dataclass

@dataclass(order=True)
class Score:
    points: int
    name: str

data = [Score(50, 'B'), Score(90, 'A'), Score(70, 'C')]
for s in sorted(data):
    print(s)

ソートキーの制御

自然なフィールド順序以外の基準でソートするには、field(init=False)を使って非表示のソートフィールドを先頭に配置し、__post_init__で設定します。他のフィールドはcompare=Falseで比較対象から除外できます。

from dataclasses import dataclass, field

@dataclass(order=True)
class Item:
    sort_index: int = field(init=False, repr=False)
    name: str = field(compare=False, default='')
    priority: int = 0

    def __post_init__(self):
        self.sort_index = self.priority

print(Item(name='b', priority=2) > Item(name='a', priority=1))

凍結と順序付けの組み合わせ

オプションは組み合わせることができます。凍結された順序付きデータクラスは、キーやバージョン番号、座標などに適した、完全な不変かつ比較可能な値型になります。

from dataclasses import dataclass

@dataclass(frozen=True, order=True)
class SemVer:
    major: int
    minor: int
    patch: int

versions = {SemVer(1, 0, 0): 'stable'}
print(SemVer(1, 0, 0) < SemVer(1, 1, 0))
print(versions[SemVer(1, 0, 0)])

eqとデフォルト値

eqオプションは、__eq__を生成するかどうかを制御します。デフォルトはTrueです。order=Trueにはeq=Trueが必要です。これは、順序付けが等価性を基盤としているためです。

from dataclasses import dataclass

@dataclass(eq=True)
class Tag:
    name: str

print(Tag('x') == Tag('x'))
print(Tag('x') == Tag('y'))

確認問題

凍結データクラスのインスタンスのフィールドに値を代入すると、どうなりますか。

まとめ

不変で順序付け可能なデータクラスの作り方を学びました。

  • frozen=Trueは変更を禁止し、インスタンスをハッシュ化可能にします。
  • 変更後のコピーにはreplace()を使います。
  • order=Trueは、フィールドをタプルとして比較する比較演算子を生成します。
  • 両方を組み合わせると、堅牢な値型になります。

よくある質問

「Frozenと比較のオプション」レッスンは無料ですか?

はい。「Frozenと比較のオプション」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「Frozenと比較のオプション」で何を学びますか?

変更不可で順序付け可能なデータクラスを作ります ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「Frozenと比較のオプション」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

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

  1. データクラスを定義する
  2. デフォルト値とfield()
  3. Frozenと比較のオプション
  4. attrsライブラリ
← Python Academyに戻る