11.3.4hashuableなクラスを生成する

frozenとは、dataclasses.dataclassデコレータに与えることができる引数の一つで、クラスが「凍結」されるかどうかを制御します。以下は、この引数についての詳細です:

frozen属性とは?

  • 意味: クラスのインスタンスが「不変(immutable)」になるかどうかを制御します。

  • デフォルト: False(クラスのインスタンスは変更可能)

frozen=True の場合:

  • クラスのインスタンスの属性は、一度設定されると変更できなくなります。
  • 属性への再代入を試みると、dataclasses.FrozenInstanceErrorが発生します。

frozen=False の場合:

  • クラスのインスタンスの属性は変更可能です。
  • 属性への再代入や追加が可能となります。

例:

python
import dataclasses @dataclasses.dataclass(frozen=True) class FrozenPerson: name: str age: int p = FrozenPerson("Alice", 30) # 以下の行はエラーとなる(frozen=Trueのため) p.name = "Bob"

frozen属性をTrueに設定することで、データクラスのインスタンスが不変となり、その後の変更を防ぐことができます。この性質は、意図しない変更からデータの一貫性を保つため、あるいはマルチスレッド環境でのデータの安全性を高めるためなどに役立ちます。






hashableとは、オブジェクトがハッシュ可能であることを意味します。ハッシュ可能とは、オブジェクトに一意なハッシュ値を生成できるという特性を指します。Pythonにおいては、このハッシュ値はhash()関数を使用して取得できます。

オブジェクトがハッシュ可能であるための条件は以下のとおりです:

  1. オブジェクトは生涯を通じて変わらないハッシュ値を持つ必要があります(オブジェクトのライフタイム中にそのハッシュ値が変更されることはない)。
  2. オブジェクトが等しい(__eq__メソッドがTrueを返す)場合、ハッシュ値も同じである必要があります。

dataclassesモジュールを使用して定義されたデータクラスにおいて、frozen=Trueを設定することで、そのデータクラスのインスタンスが不変(immutable)になります。不変なオブジェクトは、その定義によりハッシュ可能となるため、この属性を使用してハッシュ可能なクラスを生成できます。

例:

python
import dataclasses
@dataclasses.dataclass(frozen=True)
class HashablePerson:
name: str
age: int
person = HashablePerson("Alice", 30)
# 以下のコードはエラーとなる(frozen=Trueのため)
# person.name = "Bob"
# 以下のコードは正常に動作する(ハッシュ可能なオブジェクトとして)
hash_value = hash(person)
print(hash_value)

この例では、HashablePersonクラスはfrozen=Trueにより不変となっているため、そのインスタンスはハッシュ可能です。このようにして、dataclassesを使用してハッシュ可能なクラスを簡単に生成できます。



・ハッシュ値に関わるフィールド
hashオプションの設定値
設定値 概要
True フィールドをハッシュ計算に加える
None compareオプションの設定値に従う(既定)
Failse フィールドをハッシュ計算に含めない