You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何将Enum作为类构造函数参数?NameError报错解决

问题分析与修复方案

你遇到的NameError是因为在Enum类的__init__方法中,直接使用onePenny这类枚举成员名称是行不通的——枚举成员是在类完全定义完成后才成为类属性的,而__init__是在枚举成员初始化过程中调用的,这时候这些名称还没被绑定到当前作用域里。

另外你的代码还有几个需要修正的逻辑问题:

  • 把计数变量(ones、twos、fives)定义成枚举成员是错误的,枚举成员需要唯一值(你这里ones=0、twos=0会导致值重复,违反Enum的默认规则),这些计数应该是类级别的普通变量,不是枚举成员。
  • 你可能混淆了Enum的用法:Enum的每个成员是单例实例,类加载时就会初始化,如果你想创建多个硬币对象,不该直接把硬币类型和对象混在Enum里。

下面给出两种适配不同需求的修复方案:


方案1:用Enum表示硬币类型,同时创建多个硬币对象

把硬币类型和具体硬币对象分开,用Enum定义类型,再创建普通类表示硬币实例并维护计数:

from enum import Enum

# 假设你的Cash基类是这样定义的
class Cash:
    def __init__(self, value):
        self.value = value

# 用Enum定义所有硬币类型
class CoinType(Enum):
    onePenny = 1
    twoPens = 2
    fivePens = 5

# 硬币对象类,继承Cash
class Coin(Cash):
    # 类变量用于统计各类型硬币数量
    ones_count = 0
    twos_count = 0
    fives_count = 0

    def __init__(self, coin_type):
        # 调用父类初始化,设置硬币面值
        super().__init__(coin_type.value)
        # 根据传入的枚举类型更新计数
        if coin_type == CoinType.onePenny:
            Coin.ones_count += 1
        elif coin_type == CoinType.twoPens:
            Coin.twos_count += 1
        elif coin_type == CoinType.fivePens:
            Coin.fives_count += 1
        else:
            raise ValueError("不存在这种硬币类型")

使用示例:

# 创建两个1便士硬币
penny1 = Coin(CoinType.onePenny)
penny2 = Coin(CoinType.onePenny)
# 创建一个2便士硬币
two_pen = Coin(CoinType.twoPens)

print(Coin.ones_count)  # 输出2
print(Coin.twos_count)  # 输出1
print(penny1.value)     # 输出1

方案2:仅用Enum管理硬币类型,统计类型初始化次数

如果你不需要创建多个硬币对象,只是想通过Enum成员管理类型和计数,可以修正原代码,在__init__中通过类名或self引用枚举成员:

from enum import Enum

class Cash:
    value = 0  # 假设Cash有类级别的value属性

class Coin(Cash, Enum):
    onePenny = 1
    twoPens = 2
    fivePens = 5

    # 计数类变量,不属于枚举成员
    ones = 0
    twos = 0
    fives = 0

    def __init__(self, val):
        # 通过类名引用枚举成员,避免NameError
        if self == Coin.onePenny:
            Cash.value = self.value
            Coin.ones += 1
        elif self == Coin.twoPens:
            Cash.value = self.value
            Coin.twos += 1
        elif self == Coin.fivePens:
            Cash.value = self.value
            Coin.fives += 1
        else:
            print('Not existing coin.')

注意:这种方式下,枚举成员在类加载时就会初始化,所以Coin.ones一开始就是1(因为onePenny成员初始化时会调用__init__),后续访问Coin.onePenny不会重复计数,因为Enum成员是单例,只会初始化一次。

内容的提问来源于stack exchange,提问作者wkondrat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:15:20