python枚举类介绍

203 阅读2分钟

1.定义

枚举类的基本定义如下:

from enum import Enum
​
​
class Sex(Enum):
    male = 1
    female = 2

这里定义了性别Sex这个枚举类,该类有male、female这2个成员。其中,male的值为1, female的值为2

1.1 枚举类的成员名称不允许重复

from enum import Enum
​
​
class Sex(Enum):
    male = 1
    female = 2
    male = 3

运行该枚举类会报错

TypeError: Attempted to reuse key: 'male'

1.2 枚举类的成员值允许相同

from enum import Enum
​
​
class Sex(Enum):
    male = 1
    female = 1

此时,male和female具有相同的值, female就会被当做是male的别名

1.3 通过装饰器可以限制枚举内不允许成员值相同

from enum import Enum, unique
​
​
@unique
class Sex(Enum):
    male = 1
    female = 1

此时,运行该枚举类会报错:

ValueError: duplicate values found in <enum 'Sex'>: female -> male

1.4 限制枚举类的成员值只能为整数

from enum import IntEnum, unique
​
​
@unique
class Sex(IntEnum):
    male = 1
    female = 2

此时枚举类的成员值也可以为整数字符串类型

from enum import IntEnum, unique
​
​
@unique
class Sex(IntEnum):
    male = '1'
    female = '2'

如果不是整数或者整数类型的字符串,则会报错

from enum import IntEnum, unique
​
​
@unique
class Sex(IntEnum):
    male = '1'
    female = 'str'

报错如下:

ValueError: invalid literal for int() with base 10: 'str'

2.取值

2.1 获取成员

2.1.1 通过成员名称来获取成员

print(Sex.male)

result:

Sex.male

2.1.2 通过成员值来获取成员

print(Sex(1))

result:

Sex.male

2.2 获取成员名称

2.2.1 通过成员名称来获取成员

print(Sex.male.name)

result:

male

2.2.2 通过成员值来获取成员

print(Sex(1).name)

result:

male

2.3 获取成员值

2.3.1 通过成员名称来获取成员

print(Sex.male.value)

result:

1

2.3.2 通过成员值来获取成员

print(Sex(1).value)

result:

1

2.4 获取所有成员名称列表

print(Sex.__members__)

result:

OrderedDict([('male', <Sex.male: 1>), ('female', <Sex.female: 2>)])

2.5 获取所有成员名称列表

print(Sex._member_names_)

result:

['male', 'female']

2.5 获取所有成员值列表

print(list(map(int, Sex.__members__.values())))

result:

[1, 2]

3.迭代

3.1 遍历枚举成员

from enum import IntEnum, unique
​
​
@unique
class Sex(IntEnum):
    male = 1
    female = 2
​
​
for sex in Sex:
    print(sex)

result:

Sex.male
Sex.female

3.2 遍历成员值重复的枚举类

from enum import IntEnum
​
​
class Sex(IntEnum):
    male = 1
    female = 1
​
​
for sex in Sex:
    print(sex)

result:

Sex.male

默认情形下,只会遍历到值重复的第一个成员,其余的就不会遍历出来

可以通过members属性遍历出值重复的成员来

for sex in Sex.__members__.items():
    print(sex)

result:

('male', <Sex.male: 1>)
('female', <Sex.male: 1>)

4.比较

from enum import IntEnum
​
​
class Sex(IntEnum):
    male = 1
    female = 2

4.1 同一性的比较

print(Sex.male is Sex.male)

result:

True
print(Sex.male is Sex.female)

result:

False

4.2 比较是否相等

print(Sex.male == Sex.male)

result:

True
print(Sex.male == Sex.female)

result:

False
print(Sex.male != Sex.female)

result:

True

4.3 比大小

print(Sex.male < Sex.female)

result:

True