1 前言
Python 枚举(Enum)是一种用于创建具名常量的类,能够使代码更具有可读性和维护性。
通过使用枚举,可以避免魔法值(magic numbers),并为常量提供更明确的意义。
2 创建枚举类
from enum import Enum
class Color(Enum):
Red = 1
Green = 2
BLUE = 3
枚举成员:
- 名称name:成员的名称,如
RED
。
- 值value:与成员对应的值,如
1
。
3 访问枚举成员
3.1 通过名称访问
print(Color.Red)
3.2 通过值访问
print(Color(1))
3.3 不存在异常
print(Color(6))
如果值不存在 引发 ValueError 异常

4 获取枚举成员的属性
每个枚举成员都有两个重要的属性:
print(Color.Red.name, Color.Red.value)

5 遍历枚举
for color in Color:
print(color)

6 比较枚举成员
枚举成员可以使用 ==
和 is
进行比较。
6.1 使用 ==
if Color.Red == Color(1):
print("相等")

6.2 使用 is
if Color.RED is Color.RED:
print("同一实例")
7 自定义枚举类
from enum import Enum
class Status(Enum):
SUCCESS = 1
ERROR = 2
def is_success(self):
return self == Status.SUCCESS
status = Status.SUCCESS
print(status.is_success())
8 使用自动值
使用 auto() 可以自动为枚举成员分配值,这样就不需要手动设置每个值了。
from enum import auto, Enum
class Fruit(Enum):
APPLE = auto()
BANANA = auto()
ORANGE = auto()
print(Fruit.APPLE.value)
print(Fruit.BANANA.value)

9 使用 IntEnum 和 StrEnum
如果需要一个整数或字符串类型的枚举,可以使用IntEnum或StrEnum。
9.1 IntEnum
IntEnum 允许使用整数进行比较,并将枚举成员视为整数。
from enum import IntEnum
class HTTPStatus(IntEnum):
SUCCESS = 200
NOT_FOUND = 404
print(HTTPStatus.SUCCESS)
print(HTTPStatus.SUCCESS.value)
9.2 StrEnum
StrEnum 类是在 Python 3.11 中引入
9.2.1 Python 3.11 版本
from enum import StrEnum
class LogLevel(StrEnum):
DEBUG = "DEBUG"
INFO = "INFO"
WARNING = "WARNING"
ERROR = "ERROR"
print(LogLevel.DEBUG)
print(LogLevel.DEBUG.value)
9.2.2 低于Python 3.11 版本
低于Python 3.11方案
from enum import Enum
class StrEnum(str, Enum):
pass
class LogLevel(StrEnum):
DEBUG = "DEBUG"
INFO = "INFO"
WARNING = "WARNING"
ERROR = "ERROR"
print(LogLevel.DEBUG)
print(LogLevel.DEBUG.value)
10 其他特性
哈希支持:枚举成员可以用于字典的键,因为它们是可哈希的。
from enum import Enum
class Color(Enum):
Red = 1
Green = 2
Blue = 3
color_dict = {
Color.Red: "红色",
Color.Green: "绿色",
Color.Blue: "蓝色",
}
print(color_dict)
print(color_dict[Color.Red])

<h1><a id="_0"></a></h1>
<h2><a id="1__1"></a>1 前言</h2>
<p>Python 枚举(Enum)是一种用于创建具名常量的类,能够使代码更具有可读性和维护性。</p>
<p>通过使用枚举,可以避免魔法值(magic numbers),并为常量提供更明确的意义。</p>
<h2><a id="2__9"></a>2 创建枚举类</h2>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">from</span> enum <span class="hljs-keyword">import</span> Enum
<span class="hljs-keyword">class</span> <span class="hljs-title class_">Color</span>(<span class="hljs-title class_ inherited__">Enum</span>):
Red = <span class="hljs-number">1</span>
Green = <span class="hljs-number">2</span>
BLUE = <span class="hljs-number">3</span>
</code></div></pre>
<p>枚举成员:</p>
<ul>
<li>名称name:成员的名称,如 <code>RED</code>。</li>
<li>值value:与成员对应的值,如 <code>1</code>。</li>
</ul>
<h2><a id="3__25"></a>3 访问枚举成员</h2>
<h3><a id="31__27"></a>3.1 通过名称访问</h3>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-built_in">print</span>(Color.Red) <span class="hljs-comment"># 输出 Color.Red</span>
</code></div></pre>
<h3><a id="32__33"></a>3.2 通过值访问</h3>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-built_in">print</span>(Color(<span class="hljs-number">1</span>)) <span class="hljs-comment"># 输出 Color.Red</span>
</code></div></pre>
<h3><a id="33__39"></a>3.3 不存在异常</h3>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-built_in">print</span>(Color(<span class="hljs-number">6</span>))
</code></div></pre>
<p>如果值不存在 引发 ValueError 异常</p>
<p><img src="https://static.couragesteak.com/article/a1081a24be3624e5df0a39336f9b1b00.png" alt="image.png" /></p>
<h2><a id="4__49"></a>4 获取枚举成员的属性</h2>
<p>每个枚举成员都有两个重要的属性:</p>
<ul>
<li>name</li>
<li>value</li>
</ul>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-comment"># 获取枚举成员的属性</span>
<span class="hljs-built_in">print</span>(Color.Red.name, Color.Red.value)
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/b96c0c5131bb30f2bef13b53138dfd9c.png" alt="image.png" /></p>
<h2><a id="5__65"></a>5 遍历枚举</h2>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-comment"># 遍历枚举</span>
<span class="hljs-keyword">for</span> color <span class="hljs-keyword">in</span> Color:
<span class="hljs-built_in">print</span>(color)
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/398ec7dfca7b7e5a698a61efb2e0853d.png" alt="image.png" /></p>
<h2><a id="6__77"></a>6 比较枚举成员</h2>
<p>枚举成员可以使用 <code>==</code> 和 <code>is</code> 进行比较。</p>
<h3><a id="61___81"></a>6.1 使用 ==</h3>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-comment"># 比较枚举成员</span>
<span class="hljs-keyword">if</span> Color.Red == Color(<span class="hljs-number">1</span>):
<span class="hljs-built_in">print</span>(<span class="hljs-string">"相等"</span>)
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/cdbd6f84bed2bf2b52169efc8e531f09.png" alt="image.png" /></p>
<h3><a id="62__is_91"></a>6.2 使用 is</h3>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">if</span> Color.RED <span class="hljs-keyword">is</span> Color.RED:
<span class="hljs-built_in">print</span>(<span class="hljs-string">"同一实例"</span>) <span class="hljs-comment"># 输出: 同一实例</span>
</code></div></pre>
<h2><a id="7__98"></a>7 自定义枚举类</h2>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">from</span> enum <span class="hljs-keyword">import</span> Enum
<span class="hljs-keyword">class</span> <span class="hljs-title class_">Status</span>(<span class="hljs-title class_ inherited__">Enum</span>):
SUCCESS = <span class="hljs-number">1</span>
ERROR = <span class="hljs-number">2</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">is_success</span>(<span class="hljs-params">self</span>):
<span class="hljs-keyword">return</span> self == Status.SUCCESS
<span class="hljs-comment"># 使用自定义方法</span>
status = Status.SUCCESS
<span class="hljs-built_in">print</span>(status.is_success()) <span class="hljs-comment"># 输出 True</span>
</code></div></pre>
<h2><a id="8__117"></a>8 使用自动值</h2>
<p>使用 auto() 可以自动为枚举成员分配值,这样就不需要手动设置每个值了。</p>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">from</span> enum <span class="hljs-keyword">import</span> auto, Enum
<span class="hljs-keyword">class</span> <span class="hljs-title class_">Fruit</span>(<span class="hljs-title class_ inherited__">Enum</span>):
APPLE = auto()
BANANA = auto()
ORANGE = auto()
<span class="hljs-built_in">print</span>(Fruit.APPLE.value) <span class="hljs-comment"># 输出: 1</span>
<span class="hljs-built_in">print</span>(Fruit.BANANA.value) <span class="hljs-comment"># 输出: 2</span>
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/3d13a27cef181eeaf43c86d90d7369b2.png" alt="image.png" /></p>
<h2><a id="9__IntEnum__StrEnum_135"></a>9 使用 IntEnum 和 StrEnum</h2>
<p>如果需要一个整数或字符串类型的枚举,可以使用IntEnum或StrEnum。</p>
<h3><a id="91_IntEnum_139"></a>9.1 IntEnum</h3>
<p>IntEnum 允许使用整数进行比较,并将枚举成员视为整数。</p>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">from</span> enum <span class="hljs-keyword">import</span> IntEnum
<span class="hljs-keyword">class</span> <span class="hljs-title class_">HTTPStatus</span>(<span class="hljs-title class_ inherited__">IntEnum</span>):
SUCCESS = <span class="hljs-number">200</span>
NOT_FOUND = <span class="hljs-number">404</span>
<span class="hljs-built_in">print</span>(HTTPStatus.SUCCESS) <span class="hljs-comment"># 输出: HTTPStatus.OK</span>
<span class="hljs-built_in">print</span>(HTTPStatus.SUCCESS.value) <span class="hljs-comment"># 输出: 200</span>
</code></div></pre>
<h3><a id="92_StrEnum_156"></a>9.2 StrEnum</h3>
<p>StrEnum 类是在 Python 3.11 中引入</p>
<h4><a id="921_Python_311__160"></a>9.2.1 Python 3.11 版本</h4>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">from</span> enum <span class="hljs-keyword">import</span> StrEnum
<span class="hljs-keyword">class</span> <span class="hljs-title class_">LogLevel</span>(<span class="hljs-title class_ inherited__">StrEnum</span>):
DEBUG = <span class="hljs-string">"DEBUG"</span>
INFO = <span class="hljs-string">"INFO"</span>
WARNING = <span class="hljs-string">"WARNING"</span>
ERROR = <span class="hljs-string">"ERROR"</span>
<span class="hljs-built_in">print</span>(LogLevel.DEBUG) <span class="hljs-comment"># 输出: LogLevel.DEBUG</span>
<span class="hljs-built_in">print</span>(LogLevel.DEBUG.value) <span class="hljs-comment"># 输出: DEBUG</span>
</code></div></pre>
<h4><a id="922_Python_311__176"></a>9.2.2 低于Python 3.11 版本</h4>
<p>低于Python 3.11方案</p>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">from</span> enum <span class="hljs-keyword">import</span> Enum
<span class="hljs-keyword">class</span> <span class="hljs-title class_">StrEnum</span>(<span class="hljs-built_in">str</span>, Enum):
<span class="hljs-comment"># 继承 str 和 Enum 来创建一个字符串枚举类。</span>
<span class="hljs-keyword">pass</span>
<span class="hljs-keyword">class</span> <span class="hljs-title class_">LogLevel</span>(<span class="hljs-title class_ inherited__">StrEnum</span>):
DEBUG = <span class="hljs-string">"DEBUG"</span>
INFO = <span class="hljs-string">"INFO"</span>
WARNING = <span class="hljs-string">"WARNING"</span>
ERROR = <span class="hljs-string">"ERROR"</span>
<span class="hljs-built_in">print</span>(LogLevel.DEBUG) <span class="hljs-comment"># 输出: LogLevel.DEBUG</span>
<span class="hljs-built_in">print</span>(LogLevel.DEBUG.value) <span class="hljs-comment"># 输出: DEBUG</span>
</code></div></pre>
<h2><a id="10__198"></a>10 其他特性</h2>
<p><strong>哈希支持</strong>:枚举成员可以用于字典的键,因为它们是可哈希的。</p>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">from</span> enum <span class="hljs-keyword">import</span> Enum
<span class="hljs-keyword">class</span> <span class="hljs-title class_">Color</span>(<span class="hljs-title class_ inherited__">Enum</span>):
Red = <span class="hljs-number">1</span>
Green = <span class="hljs-number">2</span>
Blue = <span class="hljs-number">3</span>
<span class="hljs-comment"># 哈希支持</span>
color_dict = {
Color.Red: <span class="hljs-string">"红色"</span>,
Color.Green: <span class="hljs-string">"绿色"</span>,
Color.Blue: <span class="hljs-string">"蓝色"</span>,
}
<span class="hljs-built_in">print</span>(color_dict)
<span class="hljs-built_in">print</span>(color_dict[Color.Red])
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/6e18986a3e11724c1e49c3eea164037b.png" alt="image.png" /></p>
留言