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)
我很困惑为什么会发生这种情况,以及为什么它只发生在字符串而不是 ortuple上int。据我所知, pythonstr是不可变的,就像其他两种类型一样Strand- 尽管我不确定为什么它很重要,因为你可以在冻结的数据类中拥有可变类型。
当初始化由枚举完成时,用字符串初始化冻结数据类时是否会发生奇怪的情况?
我并不是真的在寻找解决方案,因为这个问题很容易解决,我只是对这种行为感到困惑,想知道是否有解释。我正在使用 Python 3.10.2 - 我还没有用其他 Python 版本对此进行测试。
一段时间后我明白了这一点。显然,Enum有一个名为 的内置不可设置字段name,它与您的同名字段发生冲突name。如果您将 的名称更改name为其他名称,这将按预期工作。
| 归档时间: |
|
| 查看次数: |
563 次 |
| 最近记录: |