为什么在将字符串字段添加到由 Enum 实例化的数据类时会出现 AttributeError?

lap*_*ken 2 python enums python-dataclasses python-3.10

我对这种行为感到困惑:我有一个冻结的数据类,其中只需要 10 个,所以我想将它们放入枚举中,并且成功了。后来,我意识到我希望能够为它们命名,突然间,枚举无法实例化数据类。

import enum
import dataclasses as dc

class Stats(int, enum.Enum):
    HP = 0
    STA = 1
    SPD = 2
    ATK = 3
    DEF = 4
    SPATK = 5
    SPDEF = 6

@dc.dataclass(frozen=True)
class Strand:
    keeps: tuple[Stats, ...]
    costs: int

class Strands(Strand, enum.Enum):
    VIT =   ((Stats.HP,),              1000)
    END =   ((Stats.STA,),             1000)
    LTH =   ((Stats.SPD,),             1000)
    AGG =   ((Stats.ATK,),             1000)
    HRD =   ((Stats.DEF,),             1000)
    GFT =   ((Stats.SPATK,),           1000)
    DOM =   ((Stats.SPDEF,),           1000)
    VIGOR = ((Stats.HP, Stats.STA),    5000)
    MIGHT = ((Stats.ATK, Stats.SPATK), 5000)
    IMMUN = ((Stats.DEF, Stats.SPDEF), 5000)
Run Code Online (Sandbox Code Playgroud)

上面的内容是我在添加字符串字段之前运行的成功 - 它没有执行任何操作。我将添加一个字符串Strand并更改枚举,如下所示:

@dc.dataclass(frozen=True)
class Strand:
    keeps: tuple[Stats, ...]
    costs: int
    name: str

class Strands(Strand, enum.Enum):
    VIT =   ((Stats.HP,),              1000, "Vitality")
    END =   ((Stats.STA,),             1000, "Endurance")
    LTH =   ((Stats.SPD,),             1000, "Lithe")
    AGG =   ((Stats.ATK,),             1000, "Aggressive")
    HRD =   ((Stats.DEF,),             1000, "Hardening")
    GFT =   ((Stats.SPATK,),           1000, "Gifted")
    DOM =   ((Stats.SPDEF,),           1000, "Dominant")
    VIGOR = ((Stats.HP, Stats.STA),    5000, "Vigor")
    MIGHT = ((Stats.ATK, Stats.SPATK), 5000, "Mighty")
    IMMUN = ((Stats.DEF, Stats.SPDEF), 5000, "Immunity")
Run Code Online (Sandbox Code Playgroud)

当我使用这些更改运行它时,它不再成功退出,而是给出以下错误:

Traceback (most recent call last):
  File "test.py", line 20, in <module>
    class Strands(Strand, enum.Enum):
  File "C:\Program Files\Python310\lib\enum.py", line 298, in __new__
  File "<string>", line 5, in __init__
  File "C:\Program Files\Python310\lib\types.py", line 187, in __set__
    raise AttributeError("can't set attribute")
AttributeError: can't set attribute
Run Code Online (Sandbox Code Playgroud)

我很困惑为什么会发生这种情况,以及为什么它只发生在字符串而不是 ortupleint。据我所知, pythonstr是不可变的,就像其他两种类型一样Strand- 尽管我不确定为什么它很重要,因为你可以在冻结的数据类中拥有可变类型。

当初始化由枚举完成时,用字符串初始化冻结数据类时是否会发生奇怪的情况?

我并不是真的在寻找解决方案,因为这个问题很容易解决,我只是对这种行为感到困惑,想知道是否有解释。我正在使用 Python 3.10.2 - 我还没有用其他 Python 版本对此进行测试。

Yev*_*ych 5

一段时间后我明白了这一点。显然,Enum有一个名为 的内置不可设置字段name,它与您的同名字段发生冲突name。如果您将 的名称更改name为其他名称,这将按预期工作。

  • `value` 是另一个不可设置的字段。 (3认同)