枚举(其实就是一个类)
案例:
from enum import Enum
class VIP(Enum):
RED = 1
BLACK = 2
GREEN = 3
1.枚举和普通类相比有什么优势
普通类或者字典:(1)可变 (2)没有防止相同标签的功能
枚举: (1)不可变 (2)有防止相同标签的功能
比如:
不可变性:
from enum import Enum
class VIP(Enum):
RED = 1
BLACK = 2
GREEN = 3
from enum import Enum
class VIP(Enum):
RED = 1
RED = 2 #报错
GREEN = 3
from enum import Enum
class VIP(Enum):
RED = 1
BLACK = 2
GREEN = 3
print(VIP.RED.value)
class VIP(Enum):
RED = 1
BLACK = 2
GREEN = 3
print(VIP.RED.name)
from enum import Enum
class VIP(Enum):
RED = 1
BLACK = 2
GREEN = 3
print(type(VIP.RED.name))
print(type(VIP.RED))
print(VIP['GREEN'])
结果:
<class 'str'>
<enum 'VIP'>
from enum import Enum
class VIP(Enum):
RED = 1
BLACK = 2
GREEN = 3
for v in VIP:
print(v)
结果:
VIP.RED
VIP.BLACK
(1)类型比较
例1:
from enum import Enum
class VIP(Enum):
RED = 1
BLACK = 2
GREEN = 3
res = VIP.GREEN == VIP.BLACK
print(res)
BLACK = 2
GREEN = 3
res = VIP.GREEN == VIP.GREEN
print(res)
from enum import Enum
class VIP(Enum):
RED = 1
BLACK = 2
GREEN = 3
res = VIP.GREEN > VIP.BLACK
print(res)
结果:报错
class VIP(Enum):
RED = 1
BLACK = 2
GREEN = 3
res = VIP.GREEN is VIP.GREEN #身份比较
print(res)
结果:True
例5:两个枚举的比较
from enum import Enum
class VIP(Enum):
RED = 1
BLACK = 2
GREEN = 3
class VIP2(Enum):
RED = 1
BLACK = 2
GREEN = 3
res = VIP.GREEN == VIP2.GREEN
print(res)
结果:False
4.枚举的注意事项
(1)两个数值相同
from enum import Enum
class VIP(Enum):
RED = 1
BLACK = 1
GREEN = 3
res = VIP.BLACK
print(res)
结果:VIP.RED
建议使用别名:
from enum import Enum
class VIP(Enum):
RED = 1
RED_ALIAS = 1
GREEN = 3
res = VIP.RED_ALIAS
print(res)
class VIP(Enum):
RED = 1
RED_ALIAS = 1
GREEN = 3
for v in VIP:
print(v)
结果:
VIP.RED
from enum import Enum
class VIP(Enum):
RED = 1
RED_ALIAS = 1
GREEN = 3
for v in VIP.__members__.items():
print(v)
结果:
('RED', <VIP.RED: 1>)
('RED_ALIAS', <VIP.RED: 1>)
from enum import Enum
class VIP(Enum):
RED = 1
RED_ALIAS = 1
GREEN = 3
for v in VIP.__members__:
print(v)
结果: RED RED_ALIAS GREEN
5.枚举转化
案例:
from enum import Enum
class VIP(Enum):
RED = 1
RED_ALIAS = 1
GREEN = 3
a = 1 #将a的类型转换
print(VIP(a))
结果:VIP.RED
6. IntEnum的使用
作用:将枚举统限制为数字类型
案例:
from enum import IntEnum
class VIP(IntEnum):
RED = 1
RED_ALIAS = 'str'
GREEN = 3
结果:报错
7. unique装饰器的使用
作用:限制枚举值唯一
案例:
from enum import unique
@unique
class VIP(IntEnum):
RED = 1
RED_ALIAS = 1
GREEN = 3
结果:报错
总结:枚举是一种单例模式,不需实例化
案例:
from enum import Enum
class VIP(Enum):
RED = 1
BLACK = 2
GREEN = 3
1.枚举和普通类相比有什么优势
普通类或者字典:(1)可变 (2)没有防止相同标签的功能
枚举: (1)不可变 (2)有防止相同标签的功能
比如:
不可变性:
from enum import Enum
class VIP(Enum):
RED = 1
BLACK = 2
GREEN = 3
VIP.RED=6 #试图改变标签的值 报错
防止标签相同:from enum import Enum
class VIP(Enum):
RED = 1
RED = 2 #报错
GREEN = 3
2. 枚举类型、枚举名与枚举值
(1)访问枚举值from enum import Enum
class VIP(Enum):
RED = 1
BLACK = 2
GREEN = 3
print(VIP.RED.value)
结果:1
(2)获取标签名字
from enum import Enumclass VIP(Enum):
RED = 1
BLACK = 2
GREEN = 3
print(VIP.RED.name)
结果:RED
(3)枚举类型from enum import Enum
class VIP(Enum):
RED = 1
BLACK = 2
GREEN = 3
print(type(VIP.RED.name))
print(type(VIP.RED))
print(VIP['GREEN'])
结果:
<class 'str'>
<enum 'VIP'>
VIP.GREEN
(4)遍历获取枚举类型from enum import Enum
class VIP(Enum):
RED = 1
BLACK = 2
GREEN = 3
for v in VIP:
print(v)
结果:
VIP.RED
VIP.BLACK
VIP.GREEN
3、枚举的比较运算(1)类型比较
例1:
from enum import Enum
class VIP(Enum):
RED = 1
BLACK = 2
GREEN = 3
res = VIP.GREEN == VIP.BLACK
print(res)
结果:False
例2:
from enum import Enum
class VIP(Enum):
RED = 1BLACK = 2
GREEN = 3
res = VIP.GREEN == VIP.GREEN
print(res)
结果:True
例3:from enum import Enum
class VIP(Enum):
RED = 1
BLACK = 2
GREEN = 3
res = VIP.GREEN > VIP.BLACK
print(res)
结果:报错
例4:
from enum import Enumclass VIP(Enum):
RED = 1
BLACK = 2
GREEN = 3
res = VIP.GREEN is VIP.GREEN #身份比较
print(res)
结果:True
例5:两个枚举的比较
from enum import Enum
class VIP(Enum):
RED = 1
BLACK = 2
GREEN = 3
class VIP2(Enum):
RED = 1
BLACK = 2
GREEN = 3
res = VIP.GREEN == VIP2.GREEN
print(res)
结果:False
4.枚举的注意事项
(1)两个数值相同
from enum import Enum
class VIP(Enum):
RED = 1
BLACK = 1
GREEN = 3
res = VIP.BLACK
print(res)
结果:VIP.RED
建议使用别名:
from enum import Enum
class VIP(Enum):
RED = 1
RED_ALIAS = 1
GREEN = 3
res = VIP.RED_ALIAS
print(res)
结果:VIP.RED
(2)遍历含有相同值的枚举
例1:
from enum import Enumclass VIP(Enum):
RED = 1
RED_ALIAS = 1
GREEN = 3
for v in VIP:
print(v)
结果:
VIP.RED
VIP.GREEN
例2:from enum import Enum
class VIP(Enum):
RED = 1
RED_ALIAS = 1
GREEN = 3
for v in VIP.__members__.items():
print(v)
结果:
('RED', <VIP.RED: 1>)
('RED_ALIAS', <VIP.RED: 1>)
('GREEN', <VIP.GREEN: 3>)
例3:from enum import Enum
class VIP(Enum):
RED = 1
RED_ALIAS = 1
GREEN = 3
for v in VIP.__members__:
print(v)
结果: RED RED_ALIAS GREEN
5.枚举转化
案例:
from enum import Enum
class VIP(Enum):
RED = 1
RED_ALIAS = 1
GREEN = 3
a = 1 #将a的类型转换
print(VIP(a))
结果:VIP.RED
6. IntEnum的使用
作用:将枚举统限制为数字类型
案例:
from enum import IntEnum
class VIP(IntEnum):
RED = 1
RED_ALIAS = 'str'
GREEN = 3
结果:报错
7. unique装饰器的使用
作用:限制枚举值唯一
案例:
from enum import unique
@unique
class VIP(IntEnum):
RED = 1
RED_ALIAS = 1
GREEN = 3
结果:报错
总结:枚举是一种单例模式,不需实例化