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

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)

错误原因及解决方案

错误原因

  1. 枚举类的设计限制:Python的Enum类属于特殊类型,不允许其他类继承已经定义了枚举成员的Enum子类(比如你的UserType)。当User继承UserType时,Python会将User识别为枚举类,但枚举类之间不支持这种继承逻辑,因此抛出TypeError。
  2. 逻辑关系错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:05:17