【python】枚举的基本使用,及如何实现枚举属性的自增长

文章介绍了Python中的枚举类型,如何自定义枚举成员的值,使用@unique装饰器确保值的唯一性,以及通过@property创建枚举成员的别名。在Python3.6+中,可以使用auto()实现枚举属性的自增长,而在Python3.5.2及更低版本中,需要使用其他方法。文章还提到Python2不支持enum模块。
摘要由CSDN通过智能技术生成

🛫 问题

描述

学过c的都知道,c中有enum,可以定义一组特定值的常量。
python也拥有类似的能力,不过,它不是语法层次的,而是以类库的形式提供给开发者。
今天我们就来说说python中的枚举,并通过它实现枚举属性的自增长

环境

版本号描述
文章日期2023-06-29
操作系统Win11 - 21H2 - 22000.1335
Python3.7.1
Python3.5.2

1️⃣ 枚举的基本使用

自定义枚举成员的值

在Python中,使用enum模块来创建枚举类型。枚举类型定义了一组具有命名值的常量。
可以使用枚举类型来避免硬编码常量,并提高代码的可读性和可维护性。

以下是使用enum模块创建枚举类型的示例:

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

print(Color.RED)    # Color.RED
print(Color.RED.name)   # RED
print(Color.RED.value)  # 1

在上面的示例中,定义了一个名为Color的枚举类型,它有三个常量:REDGREENBLUE。每个常量都有一个名称和一个。可以使用常量的名称和值来访问它们。

枚举类型的名称必须是唯一的,但值可以重复。可以使用枚举类型的name属性获取常量的名称,使用value属性获取常量的值。

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 5
    NEXT = 5
    END = BLUE


print(Color.RED)    # Color.RED
print(Color.RED.name)   # RED
print(Color.NEXT.value)  # 5
print(Color.END.value)  # 5

枚举值唯一:@unique

可以使用@unique装饰器来防止枚举成员具有相同的值。

from enum import Enum, unique

@unique
class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

    @property
    def name(self):
        return self.name.lower()

    @classmethod
    def from_name(cls, name):
        return cls[name.upper()]
 

当定义相同的值NEXT = 5时,会报错。
在这里插入图片描述

枚举成员的别名:@property

可以通过自定义属性,将枚举成员的名称转换为大写或小写。

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

    @property
    def nameX(self):
        return self.name.lower()


print(Color.RED)    # Color.RED
print(Color.RED.name)    # RED
print(Color.RED.nameX)    # red

枚举成员的元数据

from enum import Enum

class Color(Enum):
    RED = ('Red Color', True)
    GREEN = ('Green Color', False)
    BLUE = ('Blue Color', True)

    def __init__(self, description, flag):
        self._description_ = description
        self._flag_ = flag

    @property
    def description(self):
        return self._description_

    @property
    def flag(self):
        return self._flag_

print(Color.GREEN.name)						# GREEN
print(Color.GREEN.value)					# ('Green Color', False)
print(Color.GREEN.description)				# Green Color
print(Color.GREEN.flag)						# False
 

2️⃣ 实现枚举属性的自增长

开发中,经常定义庞大的枚举类型,这时候我们一个个去调整枚举的数值,会非常的麻烦,接下来就通过特殊手段实现枚举类型的值自增长。

python3.6+

python3.7中,我们可以通过auto这个class,自动的实现Ordinal的类属性自动增加,从而完成想要的功能。

from enum import IntEnum, Enum, auto

class Color(IntEnum):
    NORTH = 3
    SOUTH = auto()
    EAST = auto()
    WEST = auto()

print(Color.NORTH.value)  # 3
print(Color.SOUTH.value)  # 4
print(Color.EAST.value)   # 5
print(Color.WEST.value)   # 6

python3.5.2

将python环境从3.7切换到3.5.2,我们会发现下面报错内容:
在这里插入图片描述

从图中可以看出,python3.5.2中并没有实现auto类,难道python3.5.2不能实现自增长吗?只能使用最原始的,给每个值手动赋值的方式吗?
为了一探究竟,小编翻了翻python文档,文档中给了两种方案:

方案一: 使用Enum类的构造函数

文档中的用法如下:
image.png

示例代码:

from enum import Enum

Animal = Enum('Animal', 'ant bee cat dog', start=4)
print(Animal.ant)            # Animal.ant
print(Animal.cat.value)      # 6

方案二: 使用Enum类的构造函数
下面是python文档给的例子,实现自增长的枚举,这也可能就是后期python版本中的实现了。

class AutoNumber(Enum):
    def __new__(cls):
        value = len(cls.__members__) + 1
        obj = object.__new__(cls)
        obj._value_ = value
        return obj

class Color(AutoNumber):
    red = ()
    green = ()
    blue = ()

print(Color.green.value) # 2

不过这个代码功能实在有限,red = ()不能改为red = 3,也就是说,不能指定初始值。
所以在python3.5中,直接使用方案一,就可以了。

python2不支持enum模块

这个没啥说的,就是不支持这个库,直接报错。
在这里插入图片描述

没有python2的用户,可以直接通过在线工具尝试该功能:https://c.runoob.com/compile/6/
在这里插入图片描述

🛬 结论

查了些资料,说auto()这种用法是python3.6的新特性,闹心了,看来不使用新版本的python,很多功能就无法使用。对于无法更新版本的公司(线上稳定版本是旧的python版本,最新版本python无法稳定运行的情况),只能自己想办法实现类似的功能了。

📖 参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

夜猫逐梦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值