Python继承类型错误:无法扩展Enum类问题排查
问题
开发儿童银行账户管理程序时,创建了存储儿童信息的User类,以及供家长选择用户类型的UserType枚举类(继承自Enum,用auto()分配值)。尝试让User类继承UserType后,实例化User对象时抛出错误:
TypeError: <enum 'User'> cannot extend <enum 'UserType'>
尝试多重继承class User(UserType, enum.Enum):也无法解决,请问错误原因是什么?
相关代码如下:
User类代码
class User(UserType): child_id = 0 def __init__(self, child_name, child_age, user_type, bank_account_number, bank_name, bank_balance, budget): self._child_name = child_name self._child_age = child_age self._user_type = user_type.user_types.auto self._bank_account_number = bank_account_number self._bank_name = bank_name self._bank_balance = bank_balance self._budget = budget _child_id = User.id_counter()
UserType枚举类代码
import enum from enum import auto class UserType(enum.Enum): THE_ANGEL = auto() THE_REBEL = auto() THE_TROUBLEMAKER = auto()
主函数实例化代码
import user def main(): print("Welcome to FAM") print("Please select from one of the following options: ") print("1. Register your child?") print("2. Login") choice = (int(input("Select between 1 or 2\n"))) user1 = user.User("John", 12, 1, 12345, "Coast Capital", 1000, 500)
错误原因及解决方案
错误原因
- 枚举类的设计限制:Python的
Enum类属于特殊类型,不允许其他类继承已经定义了枚举成员的Enum子类(比如你的UserType)。当User继承UserType时,Python会将User识别为枚举类,但枚举类之间不支持这种继承逻辑,因此抛出TypeError。 - 逻辑关系错误:
User是存储儿童信息的实体类,UserType是标记用户类型的枚举,二者是关联关系而非继承关系。继承代表"是一种"的从属逻辑(比如Dog继承Animal),但User并不是一种UserType,用继承完全不符合业务逻辑。
修正方案
将User改为普通类,通过属性关联UserType枚举,同时修正实例化时的参数错误(原代码传入整数1,应对应UserType的枚举成员):
修正后的User类
from usertype import UserType class User: child_id = 0 def __init__(self, child_name, child_age, user_type: UserType, bank_account_number, bank_name, bank_balance, budget): self._child_name = child_name self._child_age = child_age self._user_type = user_type # 直接存储枚举成员 self._bank_account_number = bank_account_number self._bank_name = bank_name self._bank_balance = bank_balance self._budget = budget # 实现id_counter类方法,生成唯一child_id self._child_id = User.id_counter() @classmethod def id_counter(cls): cls.child_id += 1 return cls.child_id
修正后的主函数实例化代码
import user from usertype import UserType def main(): print("Welcome to FAM") print("Please select from one of the following options: ") print("1. Register your child?") print("2. Login") choice = int(input("Select between 1 or 2\n")) # 传入UserType枚举成员,而非整数 user1 = user.User("John", 12, UserType.THE_ANGEL, 12345, "Coast Capital", 1000, 500)
内容的提问来源于stack exchange,提问作者dmc
相关产品推荐
相关产品推荐

