我对这种行为感到困惑:我有一个冻结的数据集,其中只需要10个,所以我想把它们放入Enum中,并成功地做到了这一点。后来,我意识到我想要在它们上加上一个名字,突然之间,Enum无法实例化数据集。
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)在添加string字段之前,上面的内容已经成功运行--它什么也不做。我正在向Strand中添加一个字符串,并按如下方式修改Enum:
@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")当我使用这些更改运行它时,它不再成功退出,而是给出以下错误:
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我很困惑为什么会发生这种情况,以及为什么它只发生在字符串而不是tuple或int上。据我所知,python str与Strand中的其他两种类型一样是不可变的--尽管我不知道这有什么关系,因为您可以在冻结的数据集中拥有可变类型。
当使用字符串初始化冻结的数据集时,当初始化由Enum完成时,会发生什么奇怪的事情吗?
我并不是真的在寻找解决方案,因为这个问题很容易解决,我只是对这种行为感到困惑,想知道是否有解释。我正在使用Python3.10.2--我还没有在其他Python版本中测试过这一点。
发布于 2022-11-11 12:43:31
过了一段时间我想明白了。显然,Enum有一个内置的不可设置字段,名为name,它与您同名的字段name发生碰撞。如果您将name的名称更改为其他名称,这将如预期的那样工作。
https://stackoverflow.com/questions/74400049
复制相似问题