相关疑难解决方法(0)

当Frozen = True时,如何在__post_init__中设置dataclass字段的值?

我正在尝试创建冻结的数据类,但在设置中的值时遇到问题__post_init__。有没有办法从设置基于值的字段值init paramdataclass使用时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}'
Run Code Online (Sandbox Code Playgroud)

这就是痕迹

 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 …
Run Code Online (Sandbox Code Playgroud)

python

20
推荐指数
4
解决办法
1881
查看次数

如何在冻结的数据类自定义 __init__ 方法中设置属性?

我正在尝试构建一个@dataclass定义架构但实际上并未使用给定成员实例化的模型。(基本上,我@dataclass为了其他目的劫持了方便的语法)。这几乎就是我想要的:

@dataclass(frozen=True, init=False)
class Tricky:
    thing1: int
    thing2: str

    def __init__(self, thing3):
        self.thing3 = thing3
Run Code Online (Sandbox Code Playgroud)

但是我FrozenInstanceError__init__方法中得到了一个:

dataclasses.FrozenInstanceError: cannot assign to field 'thing3'
Run Code Online (Sandbox Code Playgroud)

我需要frozen=True(为了哈希)。有什么方法可以在__init__冻结上设置自定义属性@dataclass吗?

python python-3.x python-3.7 python-dataclasses

11
推荐指数
4
解决办法
7866
查看次数

python 中的 __pre_init__ 功能?

我想让字符串比较不区分大小写。为此,我想创建一个只有一个字符串字段的不可变类。在构造函数中,我想在将值分配给字段之前调用 lower() 。

我想尽可能多地使用标准类,如命名元组或数据类。使用该__post_init__函数(参见例如如何在Python中的数据类中使用__post_init__方法)感觉就像是一种黑客攻击。这也让我想知道在我在函数中更改它后该字段是否仍然冻结__post_init__

但是,我找不到__pre_init__功能。有没有更好的办法?

python

5
推荐指数
2
解决办法
7013
查看次数