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
相关产品推荐
相关产品推荐

