python 枚举

一、枚举存在的意义

  1. 枚举存在的意义是它的标签,而不是他背后的数值。
  2. 每个类中枚举值是独立无二的,枚举值是不能重复的
  3. 每个枚举类必须继承自Enum
  4. Python中,枚举实际上是一个类
from enum import Enum

class VIP(Enum):
    YELLOW = 1
    GREEN = 2
    BLACK = 3
    RED = 4

#如果VIP 是一般的普通类的话,那么VIP.YELLOW 肯定是1,而不是VIP.YELLOW
print(VIP.YELLOW) # VIP.YELLOW
print(VIP.GREEN) # VIP.GREEN

1.1枚举和普通数组相比有什么优势、枚举类型、名称、枚举值

  1. 一般数据类型是可变的,枚举是不可变得
  2. 一般数据类型没有防止相同标签得功能,枚举是有防止相同标签的功能
from enum import Enum

class VIP(Enum):
    YELLOW = 1
    GREEN = 2
    BLACK = 3
    RED = 4

#如果VIP 是一般的普通类的话,那么VIP.YELLOW 肯定是1,而不是VIP.YELLOW
print(VIP.YELLOW) # VIP.YELLOW
print(VIP.GREEN) # VIP.GREEN
print("VIP.GREEN 类型:",type(VIP.GREEN))
#VIP.YELLOW =2 #AttributeError: Cannot reassign members.报错,枚举值不能够被赋值

print("VIP.YELLOW 枚举值:",VIP.YELLOW.value)
print("VIP.GREEN 枚举值:",VIP.GREEN.value)
print("VIP.YELLOW 枚举标签:",VIP.YELLOW.name)
print("VIP.YELLOW 枚举标签类型:",type(VIP.YELLOW.name))
print("VIP.GREEN 枚举标签:",VIP.GREEN.name)
print("VIP['YELLOW']:",VIP['YELLOW'])

class Common():
    YELLOW =1  # 虽然定义了一个常量YELLOW,但是在外面任然能够改变YELLOW的值。并不是真正意义上的常量,python中真正意义上的常量只有枚举,这点和C/C++是一样的。

Common.YELLOW =2
print(Common.YELLOW)

print('============================')
#枚举是可以进行遍历的

for v in VIP:
    print(v)

1.2 枚举的比较运算

from enum import Enum

class VIP(Enum):
    YELLOW = 1
    GREEN = 2
    BLACK = 3
    RED = 4

result = VIP.YELLOW == VIP.GREEN
print(result) #False
result = VIP.YELLOW == VIP.YELLOW
print(result) #True
result = VIP.YELLOW is VIP.YELLOW
print(result) #True

result = VIP.YELLOW.value == 1  # VIP.YELLOW.value 这个才真正代表枚举类型的数值
print(result) #True
print("VIP.YELLOW 的类型:",type(VIP.YELLOW))
result = VIP.YELLOW > VIP.GREEN # 这样比较会报错
print(result) #True

1.3 使用枚举需要注意的地方

from enum import Enum

class VIP(Enum):
    YELLOW = 1
    GREEN = 1
    BLACK = 3
    RED = 4

print(VIP.GREEN) # 打印出 VIP.YELLOW,奇怪
from enum import Enum

class VIP(Enum):
    YELLOW = 1
    YELLOW_ALIAS = 1
    BLACK = 3
    RED = 4

for v in VIP:
    print(v)   #只会输出 VIP.YELLOW、VIP.BLACK、VIP.RED,不会输出YELLOW_ALIAS

for v in VIP.__members__.items():
    print(v)                   # 会输出全部枚举的详细信息

for v in VIP.__members__:
    print(v)                   # 会输出全部枚举的信息

1.4 枚举类型转换

from enum import Enum

class VIP(Enum):
    YELLOW = 1
    YELLOW_ALIAS = 1
    BLACK = 3
    RED = 4


a =1
print(VIP(a)) #输出VIP.YELLOW,通过这种方式 VIP(a),将一个数字转化为枚举类型,是一个很实用的技巧

IntEnum 的用法。

from enum import Enum
from enum import IntEnum,unique

class VIP(Enum):
    YELLOW = 1
    GREEN = 'str'
    BLACK = 3
    RED = 4

@unique
class VIP1(IntEnum):
    YELLOW = 1
    #GREEN = 1   # 一旦用装饰器 @unique,修饰某个枚举类的时候,这个类里面的枚举值是不能重复的。
    BLACK = 3
    RED = 4



class VIP2(IntEnum):
    YELLOW = 1
    #GREEN = 'str'   # VIP1 集成自 IntEnum,是会报错的,一旦继承自IntEnum 所有的枚举值必须为Int类型的整形值
    BLACK = 3
    RED = 4


vip = VIP(Enum)   # 枚举类型的在python底层实现的是,单例设计模式进行实现的,是不能进行实例化的。

你可能感兴趣的:(#,python,开发语言)