Python 中enum的使用方法总结

  • Post category:Python

Python 中 enum 的使用方法总结

什么是枚举?

枚举(Enum)是 Python 3.4 引入的标准库,在 Python 中是以类的形式实现的,用于定义常量。在实际使用中,Enum 的优势在于代码更清晰,易读性更强,方便我们对代码进行维护。

enum 的基本用法

我们首先需要导入 Enum 模块,然后使用 Enum 类定义我们想要的枚举类型。

from enum import Enum


class Weekdays(Enum):
    MONDAY = 1
    TUESDAY = 2
    WEDNESDAY = 3
    THURSDAY = 4
    FRIDAY = 5
    SATURDAY = 6
    SUNDAY = 7

上面代码中,我们自定义了一个 Weekdays 枚举类,并定义了七个常量成员变量,分别表示星期一到星期日。

枚举成员变量的访问

枚举成员变量可以通过点号(.)的方式来访问。例如,我们想要获取 Weekdays 中星期一的值,可以使用 Weekdays.MONDAY.value 来获取。

print(Weekdays.MONDAY.value)

运行结果为:

1

枚举类型的自动赋值

在上面代码示例中,我们给每个成员变量都手动指定了一个值。但是如果某些情况下,我们并不关心枚举成员变量的值,那么可以使用自动赋值。

自动赋值有三种方式:

  • 自增值:每新增一个成员变量,它的值都将比前一个大 1
  • 自定义值:可以指定其中一个枚举变量的值,后面的变量将跟着递增
  • 从 Int 继承:枚举类的类型继承自 int 类型

自增值

from enum import Enum, unique

@unique
class AutoIncrementTest(Enum):
    V1 = auto()
    V2 = auto()
    V3 = auto()

print(AutoIncrementTest.V1)
print(AutoIncrementTest.V2)
print(AutoIncrementTest.V3)

运行结果为:

AutoIncrementTest.V1
AutoIncrementTest.V2
AutoIncrementTest.V3

自定义值

from enum import Enum, unique

@unique
class CustomValueTest(Enum):
    V1 = 1
    V2 = 2
    V3 = 3

print(CustomValueTest.V1)
print(CustomValueTest.V2)
print(CustomValueTest.V3)

运行结果为:

CustomValueTest.V1
CustomValueTest.V2
CustomValueTest.V3

从 Int 继承

from enum import IntEnum


class InheritIntTest(IntEnum):
    V1 = 1
    V2 = 2
    V3 = 3

print(InheritIntTest.V1)
print(InheritIntTest.V2)
print(InheritIntTest.V3)

运行结果为:

InheritIntTest.V1
InheritIntTest.V2
InheritIntTest.V3

枚举类型的比较

使用 is、==、!= 操作符可以在枚举类型之间进行比较,它们分别表示两个枚举实例是同一个对象、同一类型但不同的对象、不同类型的对象。同时,这些比较操作符还能把枚举实例跟整型、字符串进行比较。

from enum import Enum


class Comparision(Enum):
    V1 = 1
    V2 = 2
    V3 = 3

print(Comparision.V1 is Comparision.V1)
print(Comparision.V2 == Comparision.V2)
print(Comparision.V3 != Comparision.V2)

print(Comparision.V1 == 1)
print(Comparision.V2 == 'V2')

运行结果为:

True
True
True
True
True

示例说明

示例一:使用枚举类实现单例模式

枚举类型的特性保证了成员名和成员值的唯一性,所以我们可以根据这个特性来实现单例模式。

from enum import Enum

class Singleton(Enum):
    INSTANCE = object()

    def __new__(cls):
        return cls.INSTANCE

上面代码中,我们定义了一个 Singleton 枚举类型,它只有一个名为 INSTANCE 的成员变量,值为 object(),表示一个空对象。

由于对象名和对象的值都是唯一的,所以我们可以根据 Singleton.INSTANCE 来获取单例对象。

s1 = Singleton()
s2 = Singleton()

assert s1 is s2

运行结果为:

True

示例二:使用枚举变量代替常量值

在原有代码中,数字常量并没有任何说明,容易让人误解。我们可以使用枚举变量来代替数字,更好地体现代码意义。

from enum import Enum

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

def paint(color):
    if color == Color.RED:
        print("Painting in red")
    elif color == Color.GREEN:
        print("Painting in green")
    elif color == Color.BLUE:
        print("Painting in blue")

paint(Color.GREEN)

运行结果为:

Painting in green

在上面代码中,我们使用 Color.RED、Color.GREEN、Color.BLUE 来代替 1、2、3。这样的代替方式对于代码维护和阅读都是有帮助的。

总结

本文主要讲解了 Python 中枚举类的使用方法。通过枚举类,我们可以清晰明了地表达代码意思,增强代码的可读性和可维护性。同时,枚举类的自动赋值和枚举比较操作也方便了我们对代码进行开发和测试。