python类枚举

python类,专栏总目录

1.python面向对象编程class

2.python类多重继承

3.python类私有变量

4.python包私有变量__all__

5.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

 

 

枚举类是一种特殊的,用于定义一组有限且确定的对象。枚举类的对象被称为枚举值。使用枚举类可以方便地定义一组常量,并且在代码中使用这些常量。枚举类还具有以下特点: 1. 枚举类可以实现一个或多个接口,但无法继承其他父。默认情况下,使用enum定义的枚举类会继承java.lang.Enum,该实现了java.lang.Serializable和java.lang.Comparable接口。 2. 使用enum定义的枚举类默认会使用final修饰,因此无法派生子。 3. 枚举类的构造器只能使用private访问控制符,并且必须在枚举值的前面定义。如果省略了构造器的访问控制符,则默认使用private修饰。 4. 枚举类的所有实例必须在枚举类的第一行显示列出。系统会自动为这些实例添加public static final修饰。 枚举类的优势在于可以将其看作是一个,并且每个枚举值都是该的一个实例。枚举值可以直接通过枚举类型名称调用,而且默认都是final、public和static修饰的。枚举类还提供了values()方法,用于遍历所有枚举值。 在Java中,枚举类的定义形式如下: ``` public enum ClassName { ENUM_VALUE1, ENUM_VALUE2, ... } ``` 其中,ENUM_VALUE1、ENUM_VALUE2等为枚举值。可以为枚举值添加自定义的属性和方法。 枚举类的使用可以帮助我们更好地管理和使用常量,提高代码的可读性和可维护性。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jingbo1801

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值