python类,专栏总目录:
1、枚举的特点
1.首先,定义枚举要导入enum模块;
2.枚举定义用class关键字,继承Enum类;
3.用于定义枚举的class和定义类的class是有区别。
Python提供了Enum类来实现这个功能,下面是原生定义:
from enum import Enum
Color = Enum('Color', ('red', 'orange', 'yellow', 'green')) # 1, 2, 3, 4
注:默认枚举类定义,索引从1开始。
print(Color.red.value)
=> 1
实际中更多使用继承类定义:
from enum import Enum, unique
@unique
class Color(Enum):
red = 0
orange = 1
yellow = 2
green = 3
@unique装饰器可以帮助我们检查保证没有重复值。
1.1、定义枚举时,成员名称不允许重复
from enum import Enum
class Color(Enum):
red = 1
red = 2
上面的代码,就无法执行。提示错误:TypeError: Attempted to reuse key: 'red'
1.2、默认情况下,不同的成员值允许相同
值不能相同,但是两个相同值的成员,第二个成员的名称被视作第一个成员的别名。
from enum import Enum
class Color(Enum):
red = 1
red_alias = 1
成员Color.red和Color.red_alias具有相同的值,那么成员Color.red_alias的名称red_alias就被视作成员Color.red名称red的别名。
1.3、若枚举中存在相同值的成员,在通过值获取枚举成员时,只能获取到第一个成员
from enum import Enum
class Color(Enum):
red = 1
red_alias = 1
print(Color(1))
输出结果为:Color.red
1.4、如果要限制定义枚举时,不能定义相同值的成员
要限制定义枚举时,可以使用装饰器@unique【要导入unique模块】
from enum import Enum, unique
@unique
class Color(Enum):
red = 1
red_alias = 1
再执行就会提示错误:ValueError: duplicate values found in : red_alias -> red
2、枚举取值
既可以用成员名称引用枚举常量,又可以直接根据value的值获得枚举常量。
2.1、通过成员的名称来获取成员
Color['red']
=> Color.red
Color.red.name
=> red # 'str'
Color.red.value
=> 0 # 'int'
2.2、通过成员值来获取成员
Color(2)
=> Color.yellow
2.3、通过成员,来获取它的名称和值
red_member = Color.red
red_member.name # red
red_member.value # 0
3、迭代器
3.1、枚举支持迭代器,可以遍历枚举成员
for color in Color:
print(color)
输出结果是,枚举的所有成员:
=>
Color.red
Color.orange
Color.yellow
Color.green
3.2、如果枚举有值重复的成员,循环遍历枚举时只获取值重复成员的第一个成员
from enum import Enum
class Color(Enum):
red = 1
orange = 2
yellow = 3
green = 4
red_alias = 1
for color in Color:
print(color)
输出结果是:
=>
Color.red
Color.orange
Color.yellow
Color.green
注:Color.red_alias并没有出现在输出结果中。
3.3、如果想把值重复的成员也遍历出来,要用枚举的一个特殊属性__members__
from enum import Enum
class Color(Enum):
red = 1
orange = 2
yellow = 3
green = 4
red_alias = 1
for name, member in Color.__members__.items():
print(name, '=>', member, ',', member.value)
输出结果:
=>
red => Color.red , 1
orange => Color.orange , 2
yellow => Color.yellow , 3
green => Color.green , 4
red_alias => Color.red , 1
4、枚举比较
4.1、枚举成员可进行同一性比较
Color.red is Color.red
=> True
Color.red is not Color.blue
=> True
4.2、枚举成员可进等值比较
Color.blue == Color.red
=> False
Color.blue != Color.red
=> True
4.3、枚举成员不能进行大小比较
Color.red < Color.blue
=>
TypeError: unorderable types: Color() < Color()
4.4、枚举与数字不能直接比较
枚举是个类,包含名字和值。
print(1 == Color(1))
=> False
>>>print(1 == Color(1).value)
=> True