前情提示: 测试代码中,右尖括号(>
)表示命令行中输入的命令; 单独一行并以井字符(#
)开头的为输出内容; 库的导入仅在本文的第一个测试代码中展现,其他代码块均省略库的导入代码。
- 系统类型:
Windows 10
- python 版本:
Python 3.9.0
上文中我们了解到模块中有 Enum
类,其实还有基于它的三个变种类,分别是 IntEnum
、Flag
、IntFlag
。甚至还能自定义类来实现符合需求的特殊功能。
传送门
IntEnum
IntEnum
类是 Enum
类的子类,也是 int
的子类。IntEnum
的枚举成员的值必须是 int
类型,填写其他类型会报错。
class IntTest(enum.IntEnum):
A = 1
B = 'b'
# ValueError: invalid literal for int() with base 10: 'b'
除此之外,IntEnum
类和 Enum
类最大的区别在与比较时的差异,前文中并没有介绍 Enum
类比较功能的特性,这里先说一下 Enum
类的比较:
枚举成员只与自己本身和别名相等,枚举成员与非枚举值比较永远不相等,枚举成员只能无法进行排序比较。
class TestA(enum.Enum):
A = 1
B = 1
class TestB(enum.Enum):
A = 1
B = 2
print(TestA.A is TestB.A) # 不同枚举的同名同值的枚举成员的 is 比较
# False
print(TestA.A is TestA.B) # 同一枚举的同值枚举成员 is 比较(别名)
# True
print(TestA.A == TestB.A) # 不同枚举的同名同值的枚举成员的 == 比较
# False
print(TestA.A == TestA.B) # 同一枚举的同值枚举成员 == 比较(别名)
print(TestA.A == 1) # 与 int 类型比较
# False
print(TestA.A < TestA.B) # 排序比较
# Traceback (most recent call last):
# File "e:\project\test\test.py", line 15, in <module>
# print(TestA.A < TestA.B)
# TypeError: '<' not supported between instances of 'TestA' and 'TestA'
IntEnum
的枚举成员可以直接与 int
类型的值比较,也支持排序比较,并且不同枚举的同名同值的枚举成员使用 ==
比较时也相等。
class