枚举类

1、起步

Color = {
 'RED' : 1,
 'GREEN': 2,
 'BLUE' : 3,
}
 
class Color:
 RED = 1
 GREEN = 2
 BLUE = 3


#这种来实现枚举,隐患在于可以被修改。

2、使用Enum

rom enum import Enum
class Color(Enum):
 red = 1
 green = 2
 blue = 3

print(Color.red)
#Color.red
print(repr(Color.red))
#<Color.red: 1>
print(isinstance(Color.green, Color))
#True

#C=Color()报错
#Color.red=8报错

枚举类型不可实例化,不可更改。

3、定义枚举

#定义枚举时,成员名不允许重复
from enum import Enum

class Color(Enum):
    red = 1
    green = 2
    red = 3  # TypeError: Attempted to reuse key: 'red'
#成员值允许相同,第二个成员的名称被视作第一个成员的别名


from enum import Enum

class Color(Enum):
    red = 1
    green = 2
    blue = 1


print(Color.red)  # Color.red
print(Color.blue)  # Color.red
print(Color.red is Color.blue)  # True
print(Color(1))  # Color.red 在通过值获取枚举成员时,只能获取到第一个成员
#若要不能定义相同的成员值,可以通过 unique 装饰

from enum import Enum, unique
@unique
class Color(Enum):
 red = 1
 green = 2
 blue = 1 # ValueError: duplicate values found in <enum 'Color'>: blue -> red

4、枚举取值

from enum import Enum, unique
@unique
class Color(Enum):
    red = 1
    green = 2
    yellow = 3  

#可以通过成员名来获取成员也可以通过成员值来获取成员:
print(Color['red'])  # Color.red 通过成员名来获取成员
print(Color(1))  # Color.red 通过成员值来获取成员


#每个成员都有名称属性和值属性:
member =Color.red
print(member.name)  # red
print(member.value)  # 1



#支持迭代的方式遍历成员,按定义的顺序,如果有值重复的成员,只获取重复的第一个成员:
for color in Color:
    print(color)
    
#Color.red
#Color.green
#Color.yellow



#特殊属性__members__是一个将名称映射到成员的有序字典,也可以通过它来完成遍历:
for color  in Color.__members__.items():
    print(color)  
    
#('red', <Color.red: 1>)
#('green', <Color.green: 2>)
#('yellow', <Color.yellow: 3>)

5、枚举比较

枚举的成员可以通过 is 同一性比较或通过 == 等值比较:

Color.red is Color.red
Color.green is not Color.green 
 
Color.blue == Color.red
Color.blue != Color.red

枚举成员不能进行大小比较:

Color.red < Color.blue # TypeError: unorderable types: Color() < Color()

6、扩展枚举intEnum

from enum import IntEnum


class Shape(IntEnum):
    circle = 1
    square = 2


class Request(IntEnum):
    post = 1
    get = 2


print(Shape.circle == 1)  # True
print(Shape.circle < 3)  # True
print(Shape.circle == Request.post)  # True
print(Shape.circle > Request.post)  # True```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值