1. ホーム
  2. python

frozen=Trueの時に__post_init__でdataclassフィールドの値を設定するには?

2023-10-11 22:01:15

質問

フローズン・データクラスを作成しようとしているのですが、以下のような問題があります。 __post_init__ . からの値に基づいてフィールド値を設定する方法はありますか? init param にある dataclass を使用する場合 frozen=True を設定した場合、どうなるのでしょうか?

RANKS = '2,3,4,5,6,7,8,9,10,J,Q,K,A'.split(',')
SUITS = 'H,D,C,S'.split(',')


@dataclass(order=True, frozen=True)
class Card:
    rank: str = field(compare=False)
    suit: str = field(compare=False)
    value: int = field(init=False)
    def __post_init__(self):
        self.value = RANKS.index(self.rank) + 1
    def __add__(self, other):
        if isinstance(other, Card):
            return self.value + other.value
        return self.value + other
    def __str__(self):
        return f'{self.rank} of {self.suit}'

そしてこれがそのトレースです

 File "C:/Users/user/.PyCharm2018.3/config/scratches/scratch_5.py", line 17, in __post_init__
    self.value = RANKS.index(self.rank) + 1
  File "<string>", line 3, in __setattr__
dataclasses.FrozenInstanceError: cannot assign to field 'value'

どのように解決するのですか?

使用方法 が生成されるのと同じことです。 __init__ メソッドが行う : object.__setattr__ .

def __post_init__(self):
    object.__setattr__(self, 'value', RANKS.index(self.rank) + 1)