我正在尝试创建一个冻结的数据类,但我在设置 __post_init__
的值时遇到问题。在使用 frozen=True
设置时,有没有办法根据 init param
中的 dataclass
的值设置字段值?
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'
原文由 nicholishen 发布,翻译遵循 CC BY-SA 4.0 许可协议
使用 生成的
__init__
方法执行的相同操作:object.__setattr__
。