python在使用枚举类时需要导入enum模块,枚举定义用class关键字,继承Enum类。
定义枚举时,成员名称不允许重复,成员名称相同时就会报错。
示例代码1:
from enum import Enum
from types import DynamicClassAttribute
class BaseFunc(Enum):
name = "dgw"
age = 25
sex = '男'
# 父类Enum中的方法
@DynamicClassAttribute
def new_name(self):
"""The name of the Enum member."""
return self._name_
data1 = list(map(lambda x: x.name, BaseFunc))
print(data1)
data2 = list(map(lambda x: x.new_name, BaseFunc))
print(data2)
运行结果:
示例代码2:
from enum import Enum
class BaseFunc(Enum):
name = "dgw"
age = 25
sex = '男'
data_name = BaseFunc.name
data_age = BaseFunc.age
print(data_name)
print(data_age)
print(data_name.value)
print(data_age.value)
print(data_age.value == 25)
print(data_age.value is 25)
运行结果:
默认情况下,不同的成员值允许相同。但是两个相同值的成员,第二个成员的名称被视作第一个成员的别名
示例代码3:
from enum import Enum
class BaseFunc(Enum):
name = "张三"
names = "张三"
age = 25
sex = '男'
data_name = BaseFunc.name
data_names = BaseFunc.names
print(data_name)
print(data_names)
print(data_name.value)
print(data_names.value)
运行结果:
注意:如果要限制定义枚举时,不能定义相同值的成员。可以使用装饰器@unique【要导入unique模块】,遇到值相同时就会报错。
枚举取值:
示例代码4:
from enum import Enum
class BaseFunc(Enum):
name = "张三"
age = 25
sex = '男'
# 通过成员,来获取它的名称和值
data_age1 = BaseFunc.age
# 通过成员的名称来获取成员
data_age2 = BaseFunc['age']
# 通过成员值来获取成员
data_age3 = BaseFunc(25)
print(data_age1)
print(data_age2)
print(data_age3)
print(data_age1.name)
print(data_age1.value)
print(data_age2.name)
print(data_age2.value)
print(data_age3.name)
print(data_age3.value)
运行结果:
枚举支持迭代器,可以遍历枚举成员
示例代码5:
from enum import Enum
class BaseFunc(Enum):
name = "张三"
age = 25
sex = '男'
for value in BaseFunc:
print(value, value.name, value.value)
运行结果:
如果枚举有值重复的成员,循环遍历枚举时只获取值重复成员的第一个成员
示例代码6:
from enum import Enum
class BaseFunc(Enum):
name = "张三"
names = "张三"
age = 25
sex = '男'
for value in BaseFunc:
print(value, value.name, value.value)
运行结果:
如果想把值重复的成员也遍历出来,要用枚举的一个特殊属性__members__
示例代码7:
from enum import Enum
class BaseFunc(Enum):
name = "张三"
names = "张三"
age = 25
sex = '男'
for value in BaseFunc.__members__.items():
print(value)
运行结果:
补充:
枚举成员可进行同一性比较,使用is和not等,枚举成员可进等值比较,使用==,枚举成员不能进行大小比较。