当多个嵌套类中定义了同名 IntEnum 子类(如 Car.Manufacturer 和 Plane.Manufacturer),type() 默认输出均为 <enum 'Manufacturer'>,难以直观区分;本文介绍通过自定义 __repr__ 或继承中间基类,利用 __qualname__ 输出完整限定名来解决该问题。
当多个嵌套类中定义了同名 `intenum` 子类(如 `car.manufacturer` 和 `plane.manufacturer`),`type()` 默认输出均为 `
在 Python 中,type(obj) 返回的是对象所属类的类型对象,而其默认字符串表示(即 str(type(obj)))仅显示类名(如 'Manufacturer'),不包含模块或外层类的上下文信息。这导致即使两个枚举类逻辑上完全独立(如 Car.Manufacturer 与 Plane.Manufacturer),它们的 type() 输出也完全相同:
from enum import IntEnum
class Car:
class Manufacturer(IntEnum):
BMW = 0
AUDI = 1
class Plane:
class Manufacturer(IntEnum):
AIRBUS = 0
BOEING = 1
print(type(Car.Manufacturer.BMW)) # <enum 'Manufacturer'>
print(type(Plane.Manufacturer.AIRBUS)) # <enum 'Manufacturer'>尽管 type() 的字符串表示相同,Python 内部仍能正确区分二者——type(Car.Manufacturer.BMW) is not type(Plane.Manufacturer.AIRBUS) 为 True,且 == 比较返回 False,说明类型对象本身是不同的。问题在于可读性与调试友好性不足。
✅ 推荐解决方案:使用 __qualname__ 增强 __repr__
__qualname__ 属性返回类的“限定名称”,即包含外层作用域的完整路径(如 'Car.Manufacturer'),相比 __name__(仅 'Manufacturer')更具辨识度。我们可通过重写枚举成员的 __repr__ 方法来暴露该信息:
方案一:为单个枚举类定制 __repr__
from enum import IntEnum
class Car:
class Manufacturer(IntEnum):
BMW = 0
AUDI = 1
def __repr__(self):
return f"<enum {type(self).__qualname__!r}>"
class Plane:
class Manufacturer(IntEnum):
AIRBUS = 0
BOEING = 1
def __repr__(self):
return f"<enum {type(self).__qualname__!r}>"
print(Car.Manufacturer.BMW) # <enum 'Car.Manufacturer'>
print(Plane.Manufacturer.AIRBUS) # <enum 'Plane.Manufacturer'>方案二(更优雅):定义可复用的基类 mixin
避免重复代码,推荐创建一个通用 QualEnum 基类,让所有需区分的枚举继承它:
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
立即学习“Python免费学习笔记(深入)”;
from enum import IntEnum
class QualEnum:
def __repr__(self):
return f"<enum {type(self).__qualname__!r}>"
class Car:
class Manufacturer(QualEnum, IntEnum): # 注意:mixin 必须放在 IntEnum 前
BMW = 0
AUDI = 1
class Plane:
class Manufacturer(QualEnum, IntEnum):
AIRBUS = 0
BOEING = 1
print(Car.Manufacturer.BMW) # <enum 'Car.Manufacturer'>
print(Plane.Manufacturer.AIRBUS) # <enum 'Plane.Manufacturer'>⚠️ 关键注意:多重继承时,QualEnum 必须置于 IntEnum 之前,以确保 __repr__ 被正确解析(因 IntEnum 本身已定义 __repr__,若位置靠后则会被覆盖)。
补充说明
- __qualname__ 是 Python 3.3+ 引入的标准属性,可靠且无需第三方依赖;
- 此方案不影响枚举的任何功能(值比较、迭代、JSON 序列化等均保持原样);
- 若需进一步增强调试体验,还可结合 __str__ 或自定义 __format__ 实现更丰富的输出格式。
通过合理利用 __qualname__ 与轻量级 mixin 设计,即可在不破坏原有架构的前提下,显著提升多层级同名枚举类型的可观察性与可维护性。

















