首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在将字符串字段添加到由Enum实例化的数据块时获得AttributeError?

为什么在将字符串字段添加到由Enum实例化的数据块时获得AttributeError?
EN

Stack Overflow用户
提问于 2022-11-11 08:51:43
回答 1查看 40关注 0票数 2

我对这种行为感到困惑:我有一个冻结的数据集,其中只需要10个,所以我想把它们放入Enum中,并成功地做到了这一点。后来,我意识到我想要在它们上加上一个名字,突然之间,Enum无法实例化数据集。

代码语言:javascript
复制
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:

代码语言:javascript
复制
@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")

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

代码语言:javascript
复制
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

我很困惑为什么会发生这种情况,以及为什么它只发生在字符串而不是tupleint上。据我所知,python strStrand中的其他两种类型一样是不可变的--尽管我不知道这有什么关系,因为您可以在冻结的数据集中拥有可变类型。

当使用字符串初始化冻结的数据集时,当初始化由Enum完成时,会发生什么奇怪的事情吗?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-11 12:43:31

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74400049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档