1344 lines
150 KiB
HTML
1344 lines
150 KiB
HTML
|
||
<!DOCTYPE html>
|
||
|
||
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh_CN">
|
||
<head>
|
||
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
|
||
|
||
<title>enum --- 对枚举的支持 — Python 3.8.20 文档</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
|
||
<link rel="stylesheet" href="../_static/pydoctheme.css" type="text/css" />
|
||
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
|
||
|
||
<script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
|
||
<script src="../_static/jquery.js"></script>
|
||
<script src="../_static/underscore.js"></script>
|
||
<script src="../_static/doctools.js"></script>
|
||
<script src="../_static/language_data.js"></script>
|
||
<script src="../_static/translations.js"></script>
|
||
|
||
<script src="../_static/sidebar.js"></script>
|
||
|
||
<link rel="search" type="application/opensearchdescription+xml"
|
||
title="在 Python 3.8.20 文档 中搜索"
|
||
href="../_static/opensearch.xml"/>
|
||
<link rel="author" title="关于这些文档" href="../about.html" />
|
||
<link rel="index" title="索引" href="../genindex.html" />
|
||
<link rel="search" title="搜索" href="../search.html" />
|
||
<link rel="copyright" title="版权所有" href="../copyright.html" />
|
||
<link rel="next" title="数字和数学模块" href="numeric.html" />
|
||
<link rel="prev" title="reprlib --- 另一种 repr() 实现" href="reprlib.html" />
|
||
<link rel="canonical" href="https://docs.python.org/3/library/enum.html" />
|
||
|
||
|
||
|
||
|
||
|
||
<style>
|
||
@media only screen {
|
||
table.full-width-table {
|
||
width: 100%;
|
||
}
|
||
}
|
||
</style>
|
||
<link rel="shortcut icon" type="image/png" href="../_static/py.svg" />
|
||
<script type="text/javascript" src="../_static/copybutton.js"></script>
|
||
<script type="text/javascript" src="../_static/menu.js"></script>
|
||
|
||
</head>
|
||
<body>
|
||
<div class="mobile-nav">
|
||
<input type="checkbox" id="menuToggler" class="toggler__input" aria-controls="navigation"
|
||
aria-pressed="false" aria-expanded="false" role="button" aria-label="Menu" />
|
||
<label for="menuToggler" class="toggler__label">
|
||
<span></span>
|
||
</label>
|
||
<nav class="nav-content" role="navigation">
|
||
<a href="https://www.python.org/" class="nav-logo">
|
||
<img src="../_static/py.svg" alt="Logo"/>
|
||
</a>
|
||
<div class="version_switcher_placeholder"></div>
|
||
<form role="search" class="search" action="../search.html" method="get">
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="search-icon">
|
||
<path fill-rule="nonzero"
|
||
d="M15.5 14h-.79l-.28-.27a6.5 6.5 0 001.48-5.34c-.47-2.78-2.79-5-5.59-5.34a6.505 6.505 0 00-7.27 7.27c.34 2.8 2.56 5.12 5.34 5.59a6.5 6.5 0 005.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z" fill="#444"></path>
|
||
</svg>
|
||
<input type="text" name="q" aria-label="快速搜索"/>
|
||
<input type="submit" value="转向"/>
|
||
</form>
|
||
</nav>
|
||
<div class="menu-wrapper">
|
||
<nav class="menu" role="navigation" aria-label="main navigation">
|
||
<div class="language_switcher_placeholder"></div>
|
||
<h3><a href="../contents.html">目录</a></h3>
|
||
<ul>
|
||
<li><a class="reference internal" href="#"><code class="xref py py-mod docutils literal notranslate"><span class="pre">enum</span></code> --- 对枚举的支持</a><ul>
|
||
<li><a class="reference internal" href="#module-contents">模块内容</a></li>
|
||
<li><a class="reference internal" href="#creating-an-enum">创建 Enum</a></li>
|
||
<li><a class="reference internal" href="#programmatic-access-to-enumeration-members-and-their-attributes">枚举成员及其属性的编程访问</a></li>
|
||
<li><a class="reference internal" href="#duplicating-enum-members-and-values">重复的枚举成员和值</a></li>
|
||
<li><a class="reference internal" href="#ensuring-unique-enumeration-values">确保枚举值唯一</a></li>
|
||
<li><a class="reference internal" href="#using-automatic-values">使用自动设定的值</a></li>
|
||
<li><a class="reference internal" href="#iteration">迭代</a></li>
|
||
<li><a class="reference internal" href="#comparisons">比较运算</a></li>
|
||
<li><a class="reference internal" href="#allowed-members-and-attributes-of-enumerations">合法的枚举成员和属性</a></li>
|
||
<li><a class="reference internal" href="#restricted-enum-subclassing">受限的 Enum 子类化</a></li>
|
||
<li><a class="reference internal" href="#pickling">打包(pickle)</a></li>
|
||
<li><a class="reference internal" href="#functional-api">函数式 API</a></li>
|
||
<li><a class="reference internal" href="#derived-enumerations">派生的枚举</a><ul>
|
||
<li><a class="reference internal" href="#intenum">IntEnum</a></li>
|
||
<li><a class="reference internal" href="#intflag">IntFlag</a></li>
|
||
<li><a class="reference internal" href="#flag">标志位</a></li>
|
||
<li><a class="reference internal" href="#others">其他事项</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a class="reference internal" href="#when-to-use-new-vs-init">何时使用 <code class="xref py py-meth docutils literal notranslate"><span class="pre">__new__()</span></code> 与 <code class="xref py py-meth docutils literal notranslate"><span class="pre">__init__()</span></code></a></li>
|
||
<li><a class="reference internal" href="#interesting-examples">有趣的示例</a><ul>
|
||
<li><a class="reference internal" href="#omitting-values">省略值</a><ul>
|
||
<li><a class="reference internal" href="#using-auto">使用 <code class="xref py py-class docutils literal notranslate"><span class="pre">auto</span></code></a></li>
|
||
<li><a class="reference internal" href="#using-object">使用 <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></a></li>
|
||
<li><a class="reference internal" href="#using-a-descriptive-string">使用描述性字符串</a></li>
|
||
<li><a class="reference internal" href="#using-a-custom-new">使用自定义的 <code class="xref py py-meth docutils literal notranslate"><span class="pre">__new__()</span></code></a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a class="reference internal" href="#orderedenum">OrderedEnum</a></li>
|
||
<li><a class="reference internal" href="#duplicatefreeenum">DuplicateFreeEnum</a></li>
|
||
<li><a class="reference internal" href="#planet">Planet</a></li>
|
||
<li><a class="reference internal" href="#timeperiod">TimePeriod</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a class="reference internal" href="#how-are-enums-different">各种枚举有何区别?</a><ul>
|
||
<li><a class="reference internal" href="#enum-classes">枚举类</a></li>
|
||
<li><a class="reference internal" href="#enum-members-aka-instances">枚举成员(即实例)</a></li>
|
||
<li><a class="reference internal" href="#finer-points">细节要点</a><ul>
|
||
<li><a class="reference internal" href="#supported-dunder-names">支持的 <code class="docutils literal notranslate"><span class="pre">__dunder__</span></code> 名称</a></li>
|
||
<li><a class="reference internal" href="#supported-sunder-names">支持的 <code class="docutils literal notranslate"><span class="pre">_sunder_</span></code> 名称</a></li>
|
||
<li><a class="reference internal" href="#enum-member-type"><code class="docutils literal notranslate"><span class="pre">Enum</span></code> 成员类型</a></li>
|
||
<li><a class="reference internal" href="#boolean-value-of-enum-classes-and-members"><code class="docutils literal notranslate"><span class="pre">Enum</span></code> 类和成员的布尔值</a></li>
|
||
<li><a class="reference internal" href="#enum-classes-with-methods">带有方法的 <code class="docutils literal notranslate"><span class="pre">Enum</span></code> 类</a></li>
|
||
<li><a class="reference internal" href="#combining-members-of-flag">组合 <code class="docutils literal notranslate"><span class="pre">Flag</span></code> 的成员</a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
|
||
<h4>上一个主题</h4>
|
||
<p class="topless"><a href="reprlib.html"
|
||
title="上一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">reprlib</span></code> --- 另一种 <code class="xref py py-func docutils literal notranslate"><span class="pre">repr()</span></code> 实现</a></p>
|
||
<h4>下一个主题</h4>
|
||
<p class="topless"><a href="numeric.html"
|
||
title="下一章">数字和数学模块</a></p>
|
||
<div role="note" aria-label="source link">
|
||
<h3>本页</h3>
|
||
<ul class="this-page-menu">
|
||
<li><a href="../bugs.html">报告 Bug</a></li>
|
||
<li>
|
||
<a href="https://github.com/python/cpython/blob/3.8/Doc/library/enum.rst"
|
||
rel="nofollow">显示源代码
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</nav>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outdated-warning" style="padding: .5em; text-align: center; background-color: #FFBABA; color: #6A0E0E;">
|
||
这个文档所针对的是一个已不再受支持的 Python 旧版本。
|
||
你应当升级版本,并阅读
|
||
<a href="/3/library/enum.html"> Python 当前稳定版本的文档</a>.
|
||
</div>
|
||
|
||
<div class="related" role="navigation" aria-label="related navigation">
|
||
<h3>导航</h3>
|
||
<ul>
|
||
<li class="right" style="margin-right: 10px">
|
||
<a href="../genindex.html" title="总目录"
|
||
accesskey="I">索引</a></li>
|
||
<li class="right" >
|
||
<a href="../py-modindex.html" title="Python 模块索引"
|
||
>模块</a> |</li>
|
||
<li class="right" >
|
||
<a href="numeric.html" title="数字和数学模块"
|
||
accesskey="N">下一页</a> |</li>
|
||
<li class="right" >
|
||
<a href="reprlib.html" title="reprlib --- 另一种 repr() 实现"
|
||
accesskey="P">上一页</a> |</li>
|
||
|
||
<li><img src="../_static/py.svg" alt="python logo" style="vertical-align: middle; margin-top: -1px"/></li>
|
||
<li><a href="https://www.python.org/">Python</a> »</li>
|
||
<li class="switchers">
|
||
<div class="language_switcher_placeholder"></div>
|
||
<div class="version_switcher_placeholder"></div>
|
||
</li>
|
||
<li>
|
||
|
||
</li>
|
||
<li id="cpython-language-and-version">
|
||
<a href="../index.html">3.8.20 Documentation</a> »
|
||
</li>
|
||
|
||
<li class="nav-item nav-item-1"><a href="index.html" >Python 标准库</a> »</li>
|
||
<li class="nav-item nav-item-2"><a href="datatypes.html" accesskey="U">数据类型</a> »</li>
|
||
<li class="right">
|
||
|
||
|
||
<div class="inline-search" role="search">
|
||
<form class="inline-search" action="../search.html" method="get">
|
||
<input placeholder="快速搜索" aria-label="快速搜索" type="text" name="q" />
|
||
<input type="submit" value="转向" />
|
||
<input type="hidden" name="check_keywords" value="yes" />
|
||
<input type="hidden" name="area" value="default" />
|
||
</form>
|
||
</div>
|
||
|
|
||
</li>
|
||
|
||
</ul>
|
||
</div>
|
||
|
||
<div class="document">
|
||
<div class="documentwrapper">
|
||
<div class="bodywrapper">
|
||
<div class="body" role="main">
|
||
|
||
<section id="module-enum">
|
||
<span id="enum-support-for-enumerations"></span><h1><a class="reference internal" href="#module-enum" title="enum: Implementation of an enumeration class."><code class="xref py py-mod docutils literal notranslate"><span class="pre">enum</span></code></a> --- 对枚举的支持<a class="headerlink" href="#module-enum" title="永久链接至标题">¶</a></h1>
|
||
<div class="versionadded">
|
||
<p><span class="versionmodified added">3.4 新版功能.</span></p>
|
||
</div>
|
||
<p><strong>源代码:</strong> <a class="reference external" href="https://github.com/python/cpython/tree/3.8/Lib/enum.py">Lib/enum.py</a></p>
|
||
<hr class="docutils" />
|
||
<p>枚举是与多个唯一常量值绑定的一组符号名(即成员)。枚举中的成员可以进行身份比较,并且枚举自身也可迭代。</p>
|
||
<div class="admonition note">
|
||
<p class="admonition-title">注解</p>
|
||
<p>枚举成员名的大小写</p>
|
||
<p>枚举表示的是常量,因此,建议枚举成员名称使用大写字母,本篇的示例将用此种风格。</p>
|
||
</div>
|
||
<section id="module-contents">
|
||
<h2>模块内容<a class="headerlink" href="#module-contents" title="永久链接至标题">¶</a></h2>
|
||
<p>本模块定义了四个枚举类,用来定义名称与值的唯一组合: <a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a>、<a class="reference internal" href="#enum.IntEnum" title="enum.IntEnum"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntEnum</span></code></a>、<a class="reference internal" href="#enum.Flag" title="enum.Flag"><code class="xref py py-class docutils literal notranslate"><span class="pre">Flag</span></code></a> 和 <a class="reference internal" href="#enum.IntFlag" title="enum.IntFlag"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntFlag</span></code></a>。此外,还定义了一个装饰器,<a class="reference internal" href="#enum.unique" title="enum.unique"><code class="xref py py-func docutils literal notranslate"><span class="pre">unique()</span></code></a>, 和一个辅助类,<a class="reference internal" href="#enum.auto" title="enum.auto"><code class="xref py py-class docutils literal notranslate"><span class="pre">auto</span></code></a>。</p>
|
||
<dl class="class">
|
||
<dt id="enum.Enum">
|
||
<em class="property">class </em><code class="sig-prename descclassname">enum.</code><code class="sig-name descname">Enum</code><a class="headerlink" href="#enum.Enum" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>创建枚举常量的基类。 如需了解另一种构建语法,请参阅 <a class="reference internal" href="#functional-api">Functional API</a> 小节。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="class">
|
||
<dt id="enum.IntEnum">
|
||
<em class="property">class </em><code class="sig-prename descclassname">enum.</code><code class="sig-name descname">IntEnum</code><a class="headerlink" href="#enum.IntEnum" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>创建 <a class="reference internal" href="functions.html#int" title="int"><code class="xref py py-class docutils literal notranslate"><span class="pre">int</span></code></a> 子类枚举常量的基类。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="class">
|
||
<dt id="enum.IntFlag">
|
||
<em class="property">class </em><code class="sig-prename descclassname">enum.</code><code class="sig-name descname">IntFlag</code><a class="headerlink" href="#enum.IntFlag" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>创建可与位运算符搭配使用,又不失去 <a class="reference internal" href="#enum.IntFlag" title="enum.IntFlag"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntFlag</span></code></a> 成员资格的枚举常量的基类。<a class="reference internal" href="#enum.IntFlag" title="enum.IntFlag"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntFlag</span></code></a> 成员也是 <a class="reference internal" href="functions.html#int" title="int"><code class="xref py py-class docutils literal notranslate"><span class="pre">int</span></code></a> 的子类。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="class">
|
||
<dt id="enum.Flag">
|
||
<em class="property">class </em><code class="sig-prename descclassname">enum.</code><code class="sig-name descname">Flag</code><a class="headerlink" href="#enum.Flag" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>创建可与位运算符搭配使用,又不会失去 <a class="reference internal" href="#enum.Flag" title="enum.Flag"><code class="xref py py-class docutils literal notranslate"><span class="pre">Flag</span></code></a> 成员资格的枚举常量的基类。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="function">
|
||
<dt>
|
||
<code class="sig-prename descclassname">enum.</code><code class="sig-name descname">unique</code><span class="sig-paren">(</span><span class="sig-paren">)</span></dt>
|
||
<dd><p>确保一个名称只绑定一个值的 Enum 类装饰器。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="class">
|
||
<dt id="enum.auto">
|
||
<em class="property">class </em><code class="sig-prename descclassname">enum.</code><code class="sig-name descname">auto</code><a class="headerlink" href="#enum.auto" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>实例会被替换为一个可作为 Enum 成员的适当的值。 初始值从 1 开始。</p>
|
||
</dd></dl>
|
||
|
||
<div class="versionadded">
|
||
<p><span class="versionmodified added">3.6 新版功能: </span><code class="docutils literal notranslate"><span class="pre">Flag</span></code>, <code class="docutils literal notranslate"><span class="pre">IntFlag</span></code>, <code class="docutils literal notranslate"><span class="pre">auto</span></code></p>
|
||
</div>
|
||
</section>
|
||
<section id="creating-an-enum">
|
||
<h2>创建 Enum<a class="headerlink" href="#creating-an-enum" title="永久链接至标题">¶</a></h2>
|
||
<p>枚举是由 <a class="reference internal" href="../reference/compound_stmts.html#class"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">class</span></code></a> 句法创建的,这种方式易读、易写。 另一种创建方法请参阅 <a class="reference internal" href="#functional-api">Functional API</a>。<a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 以如下定义枚举:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">enum</span> <span class="kn">import</span> <span class="n">Enum</span>
|
||
<span class="gp">>>> </span><span class="k">class</span> <span class="nc">Color</span><span class="p">(</span><span class="n">Enum</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">RED</span> <span class="o">=</span> <span class="mi">1</span>
|
||
<span class="gp">... </span> <span class="n">GREEN</span> <span class="o">=</span> <span class="mi">2</span>
|
||
<span class="gp">... </span> <span class="n">BLUE</span> <span class="o">=</span> <span class="mi">3</span>
|
||
<span class="gp">...</span>
|
||
</pre></div>
|
||
</div>
|
||
<div class="admonition note">
|
||
<p class="admonition-title">注解</p>
|
||
<p>Enum 成员值</p>
|
||
<p>成员值可以是 <a class="reference internal" href="functions.html#int" title="int"><code class="xref py py-class docutils literal notranslate"><span class="pre">int</span></code></a>、<a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a> 等。若无需设定确切值,<a class="reference internal" href="#enum.auto" title="enum.auto"><code class="xref py py-class docutils literal notranslate"><span class="pre">auto</span></code></a> 实例可以自动为成员分配合适 的值。将 <a class="reference internal" href="#enum.auto" title="enum.auto"><code class="xref py py-class docutils literal notranslate"><span class="pre">auto</span></code></a> 与其他值混用时必须要慎重。</p>
|
||
</div>
|
||
<div class="admonition note">
|
||
<p class="admonition-title">注解</p>
|
||
<p>命名法</p>
|
||
<ul class="simple">
|
||
<li><p>类 <code class="xref py py-class docutils literal notranslate"><span class="pre">Color</span></code> 是 <em>枚举</em> (或称为 <em>enum</em> )。</p></li>
|
||
<li><p><code class="xref py py-attr docutils literal notranslate"><span class="pre">Color.RED</span></code>、<code class="xref py py-attr docutils literal notranslate"><span class="pre">Color.GREEN</span></code> 等属性是 <em>枚举成员</em> (或 <em>enum 成员</em>),也是常量。</p></li>
|
||
<li><p>枚举成员具有 <em>名称</em> 和 <em>值</em> (例如 <code class="xref py py-attr docutils literal notranslate"><span class="pre">Color.RED</span></code> 的名称为 <code class="docutils literal notranslate"><span class="pre">RED</span></code>,<code class="xref py py-attr docutils literal notranslate"><span class="pre">Color.BLUE</span></code> 的值为 <code class="docutils literal notranslate"><span class="pre">3</span></code> 等等)</p></li>
|
||
</ul>
|
||
</div>
|
||
<div class="admonition note">
|
||
<p class="admonition-title">注解</p>
|
||
<p>虽然 Enum 由 <a class="reference internal" href="../reference/compound_stmts.html#class"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">class</span></code></a> 语法创建,但 Enum 并不是常规的 Python 类。详见 <a class="reference internal" href="#how-are-enums-different">How are Enums different?</a>。</p>
|
||
</div>
|
||
<p>枚举成员的字符串表现形式更容易理解:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="n">Color</span><span class="o">.</span><span class="n">RED</span><span class="p">)</span>
|
||
<span class="go">Color.RED</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>同时,它的 <code class="docutils literal notranslate"><span class="pre">repr</span></code> 包含更多信息:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">Color</span><span class="o">.</span><span class="n">RED</span><span class="p">))</span>
|
||
<span class="go"><Color.RED: 1></span>
|
||
</pre></div>
|
||
</div>
|
||
<p>枚举成员的 <em>类型</em> 就是它所属的枚举:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">type</span><span class="p">(</span><span class="n">Color</span><span class="o">.</span><span class="n">RED</span><span class="p">)</span>
|
||
<span class="go"><enum 'Color'></span>
|
||
<span class="gp">>>> </span><span class="nb">isinstance</span><span class="p">(</span><span class="n">Color</span><span class="o">.</span><span class="n">GREEN</span><span class="p">,</span> <span class="n">Color</span><span class="p">)</span>
|
||
<span class="go">True</span>
|
||
<span class="gp">>>></span>
|
||
</pre></div>
|
||
</div>
|
||
<p>Enum 成员还包含 name 属性:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="n">Color</span><span class="o">.</span><span class="n">RED</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
|
||
<span class="go">RED</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>枚举按定义的顺序进行迭代:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span> <span class="nc">Shake</span><span class="p">(</span><span class="n">Enum</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">VANILLA</span> <span class="o">=</span> <span class="mi">7</span>
|
||
<span class="gp">... </span> <span class="n">CHOCOLATE</span> <span class="o">=</span> <span class="mi">4</span>
|
||
<span class="gp">... </span> <span class="n">COOKIES</span> <span class="o">=</span> <span class="mi">9</span>
|
||
<span class="gp">... </span> <span class="n">MINT</span> <span class="o">=</span> <span class="mi">3</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="k">for</span> <span class="n">shake</span> <span class="ow">in</span> <span class="n">Shake</span><span class="p">:</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="n">shake</span><span class="p">)</span>
|
||
<span class="gp">...</span>
|
||
<span class="go">Shake.VANILLA</span>
|
||
<span class="go">Shake.CHOCOLATE</span>
|
||
<span class="go">Shake.COOKIES</span>
|
||
<span class="go">Shake.MINT</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>枚举成员可哈希,可用于字典和集合:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">apples</span> <span class="o">=</span> <span class="p">{}</span>
|
||
<span class="gp">>>> </span><span class="n">apples</span><span class="p">[</span><span class="n">Color</span><span class="o">.</span><span class="n">RED</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'red delicious'</span>
|
||
<span class="gp">>>> </span><span class="n">apples</span><span class="p">[</span><span class="n">Color</span><span class="o">.</span><span class="n">GREEN</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'granny smith'</span>
|
||
<span class="gp">>>> </span><span class="n">apples</span> <span class="o">==</span> <span class="p">{</span><span class="n">Color</span><span class="o">.</span><span class="n">RED</span><span class="p">:</span> <span class="s1">'red delicious'</span><span class="p">,</span> <span class="n">Color</span><span class="o">.</span><span class="n">GREEN</span><span class="p">:</span> <span class="s1">'granny smith'</span><span class="p">}</span>
|
||
<span class="go">True</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="programmatic-access-to-enumeration-members-and-their-attributes">
|
||
<h2>枚举成员及其属性的编程访问<a class="headerlink" href="#programmatic-access-to-enumeration-members-and-their-attributes" title="永久链接至标题">¶</a></h2>
|
||
<p>有时,要在程序中访问枚举成员(如,开发时不知道颜色的确切值,<code class="docutils literal notranslate"><span class="pre">Color.RED</span></code> 不适用的情况)。<code class="docutils literal notranslate"><span class="pre">Enum</span></code> 支持如下访问方式:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">Color</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
|
||
<span class="go"><Color.RED: 1></span>
|
||
<span class="gp">>>> </span><span class="n">Color</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
|
||
<span class="go"><Color.BLUE: 3></span>
|
||
</pre></div>
|
||
</div>
|
||
<p>若要用 <em>名称</em> 访问枚举成员时,可使用枚举项:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">Color</span><span class="p">[</span><span class="s1">'RED'</span><span class="p">]</span>
|
||
<span class="go"><Color.RED: 1></span>
|
||
<span class="gp">>>> </span><span class="n">Color</span><span class="p">[</span><span class="s1">'GREEN'</span><span class="p">]</span>
|
||
<span class="go"><Color.GREEN: 2></span>
|
||
</pre></div>
|
||
</div>
|
||
<p>若有了枚举成员,需要获取 <code class="xref py py-attr docutils literal notranslate"><span class="pre">name</span></code> 或 <code class="xref py py-attr docutils literal notranslate"><span class="pre">value</span></code>:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">member</span> <span class="o">=</span> <span class="n">Color</span><span class="o">.</span><span class="n">RED</span>
|
||
<span class="gp">>>> </span><span class="n">member</span><span class="o">.</span><span class="n">name</span>
|
||
<span class="go">'RED'</span>
|
||
<span class="gp">>>> </span><span class="n">member</span><span class="o">.</span><span class="n">value</span>
|
||
<span class="go">1</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="duplicating-enum-members-and-values">
|
||
<h2>重复的枚举成员和值<a class="headerlink" href="#duplicating-enum-members-and-values" title="永久链接至标题">¶</a></h2>
|
||
<p>两个枚举成员的名称不能相同:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span> <span class="nc">Shape</span><span class="p">(</span><span class="n">Enum</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">SQUARE</span> <span class="o">=</span> <span class="mi">2</span>
|
||
<span class="gp">... </span> <span class="n">SQUARE</span> <span class="o">=</span> <span class="mi">3</span>
|
||
<span class="gp">...</span>
|
||
<span class="gt">Traceback (most recent call last):</span>
|
||
<span class="c">...</span>
|
||
<span class="gr">TypeError</span>: <span class="n">Attempted to reuse key: 'SQUARE'</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>但是,两个枚举成员可以有相同的值。假设,成员 A 和 B 的值相同(先定义的是 A),则 B 是 A 的别名。按值查找 A 和 B 的值返回的是 A。按名称查找 B,返回的也是 A:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span> <span class="nc">Shape</span><span class="p">(</span><span class="n">Enum</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">SQUARE</span> <span class="o">=</span> <span class="mi">2</span>
|
||
<span class="gp">... </span> <span class="n">DIAMOND</span> <span class="o">=</span> <span class="mi">1</span>
|
||
<span class="gp">... </span> <span class="n">CIRCLE</span> <span class="o">=</span> <span class="mi">3</span>
|
||
<span class="gp">... </span> <span class="n">ALIAS_FOR_SQUARE</span> <span class="o">=</span> <span class="mi">2</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="n">Shape</span><span class="o">.</span><span class="n">SQUARE</span>
|
||
<span class="go"><Shape.SQUARE: 2></span>
|
||
<span class="gp">>>> </span><span class="n">Shape</span><span class="o">.</span><span class="n">ALIAS_FOR_SQUARE</span>
|
||
<span class="go"><Shape.SQUARE: 2></span>
|
||
<span class="gp">>>> </span><span class="n">Shape</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
|
||
<span class="go"><Shape.SQUARE: 2></span>
|
||
</pre></div>
|
||
</div>
|
||
<div class="admonition note">
|
||
<p class="admonition-title">注解</p>
|
||
<p>不允许创建与已定义属性(其他成员、方法等)同名的成员,也不支持创建与现有成员同名的属性。</p>
|
||
</div>
|
||
</section>
|
||
<section id="ensuring-unique-enumeration-values">
|
||
<h2>确保枚举值唯一<a class="headerlink" href="#ensuring-unique-enumeration-values" title="永久链接至标题">¶</a></h2>
|
||
<p>默认情况下,枚举允许多个名称作为一个值的别名。如需禁用此行为,下述装饰器可以确保枚举中的值仅能只用一次:</p>
|
||
<dl class="function">
|
||
<dt id="enum.unique">
|
||
<code class="sig-prename descclassname">@</code><code class="sig-prename descclassname">enum.</code><code class="sig-name descname">unique</code><a class="headerlink" href="#enum.unique" title="永久链接至目标">¶</a></dt>
|
||
<dd></dd></dl>
|
||
|
||
<p>专用于枚举的 <a class="reference internal" href="../reference/compound_stmts.html#class"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">class</span></code></a> 装饰器。 它会搜索一个枚举的 <code class="xref py py-attr docutils literal notranslate"><span class="pre">__members__</span></code> 并收集所找到的任何别名;只要找到任何别名就会引发 <a class="reference internal" href="exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ValueError</span></code></a> 并附带相关细节信息:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">enum</span> <span class="kn">import</span> <span class="n">Enum</span><span class="p">,</span> <span class="n">unique</span>
|
||
<span class="gp">>>> </span><span class="nd">@unique</span>
|
||
<span class="gp">... </span><span class="k">class</span> <span class="nc">Mistake</span><span class="p">(</span><span class="n">Enum</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">ONE</span> <span class="o">=</span> <span class="mi">1</span>
|
||
<span class="gp">... </span> <span class="n">TWO</span> <span class="o">=</span> <span class="mi">2</span>
|
||
<span class="gp">... </span> <span class="n">THREE</span> <span class="o">=</span> <span class="mi">3</span>
|
||
<span class="gp">... </span> <span class="n">FOUR</span> <span class="o">=</span> <span class="mi">3</span>
|
||
<span class="gp">...</span>
|
||
<span class="gt">Traceback (most recent call last):</span>
|
||
<span class="c">...</span>
|
||
<span class="gr">ValueError</span>: <span class="n">duplicate values found in <enum 'Mistake'>: FOUR -> THREE</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="using-automatic-values">
|
||
<h2>使用自动设定的值<a class="headerlink" href="#using-automatic-values" title="永久链接至标题">¶</a></h2>
|
||
<p>如果具体的枚举值无所谓是什么,可以使用 <a class="reference internal" href="#enum.auto" title="enum.auto"><code class="xref py py-class docutils literal notranslate"><span class="pre">auto</span></code></a>:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">enum</span> <span class="kn">import</span> <span class="n">Enum</span><span class="p">,</span> <span class="n">auto</span>
|
||
<span class="gp">>>> </span><span class="k">class</span> <span class="nc">Color</span><span class="p">(</span><span class="n">Enum</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">RED</span> <span class="o">=</span> <span class="n">auto</span><span class="p">()</span>
|
||
<span class="gp">... </span> <span class="n">BLUE</span> <span class="o">=</span> <span class="n">auto</span><span class="p">()</span>
|
||
<span class="gp">... </span> <span class="n">GREEN</span> <span class="o">=</span> <span class="n">auto</span><span class="p">()</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="nb">list</span><span class="p">(</span><span class="n">Color</span><span class="p">)</span>
|
||
<span class="go">[<Color.RED: 1>, <Color.BLUE: 2>, <Color.GREEN: 3>]</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>枚举值将交由 <code class="xref py py-func docutils literal notranslate"><span class="pre">_generate_next_value_()</span></code> 选取,该函数可以被重写:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span> <span class="nc">AutoName</span><span class="p">(</span><span class="n">Enum</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="k">def</span> <span class="nf">_generate_next_value_</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">count</span><span class="p">,</span> <span class="n">last_values</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="k">return</span> <span class="n">name</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="k">class</span> <span class="nc">Ordinal</span><span class="p">(</span><span class="n">AutoName</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">NORTH</span> <span class="o">=</span> <span class="n">auto</span><span class="p">()</span>
|
||
<span class="gp">... </span> <span class="n">SOUTH</span> <span class="o">=</span> <span class="n">auto</span><span class="p">()</span>
|
||
<span class="gp">... </span> <span class="n">EAST</span> <span class="o">=</span> <span class="n">auto</span><span class="p">()</span>
|
||
<span class="gp">... </span> <span class="n">WEST</span> <span class="o">=</span> <span class="n">auto</span><span class="p">()</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="nb">list</span><span class="p">(</span><span class="n">Ordinal</span><span class="p">)</span>
|
||
<span class="go">[<Ordinal.NORTH: 'NORTH'>, <Ordinal.SOUTH: 'SOUTH'>, <Ordinal.EAST: 'EAST'>, <Ordinal.WEST: 'WEST'>]</span>
|
||
</pre></div>
|
||
</div>
|
||
<div class="admonition note">
|
||
<p class="admonition-title">注解</p>
|
||
<p>默认 <code class="xref py py-meth docutils literal notranslate"><span class="pre">_generate_next_value_()</span></code> 方法的目标是提供所给出的最后一个 <a class="reference internal" href="functions.html#int" title="int"><code class="xref py py-class docutils literal notranslate"><span class="pre">int</span></code></a> 所在序列的下一个 <a class="reference internal" href="functions.html#int" title="int"><code class="xref py py-class docutils literal notranslate"><span class="pre">int</span></code></a>,但这种行为方式属于实现细节并且可能发生改变。</p>
|
||
</div>
|
||
<div class="admonition note">
|
||
<p class="admonition-title">注解</p>
|
||
<p><code class="xref py py-meth docutils literal notranslate"><span class="pre">_generate_next_value_()</span></code> 方法的定义必须在任何其他成员之前。</p>
|
||
</div>
|
||
</section>
|
||
<section id="iteration">
|
||
<h2>迭代<a class="headerlink" href="#iteration" title="永久链接至标题">¶</a></h2>
|
||
<p>对枚举成员的迭代遍历不会列出别名:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">list</span><span class="p">(</span><span class="n">Shape</span><span class="p">)</span>
|
||
<span class="go">[<Shape.SQUARE: 2>, <Shape.DIAMOND: 1>, <Shape.CIRCLE: 3>]</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>特殊属性 <code class="docutils literal notranslate"><span class="pre">__members__</span></code> 是一个名称与成员间的只读有序映射。包含了枚举中定义的所有名称,包括别名:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">member</span> <span class="ow">in</span> <span class="n">Shape</span><span class="o">.</span><span class="n">__members__</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
||
<span class="gp">... </span> <span class="n">name</span><span class="p">,</span> <span class="n">member</span>
|
||
<span class="gp">...</span>
|
||
<span class="go">('SQUARE', <Shape.SQUARE: 2>)</span>
|
||
<span class="go">('DIAMOND', <Shape.DIAMOND: 1>)</span>
|
||
<span class="go">('CIRCLE', <Shape.CIRCLE: 3>)</span>
|
||
<span class="go">('ALIAS_FOR_SQUARE', <Shape.SQUARE: 2>)</span>
|
||
</pre></div>
|
||
</div>
|
||
<p><code class="docutils literal notranslate"><span class="pre">__members__</span></code> 属性可用于获取枚举成员的详细信息。比如查找所有别名:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="p">[</span><span class="n">name</span> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">member</span> <span class="ow">in</span> <span class="n">Shape</span><span class="o">.</span><span class="n">__members__</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="n">member</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">name</span><span class="p">]</span>
|
||
<span class="go">['ALIAS_FOR_SQUARE']</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="comparisons">
|
||
<h2>比较运算<a class="headerlink" href="#comparisons" title="永久链接至标题">¶</a></h2>
|
||
<p>枚举成员是按 ID 进行比较的:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">Color</span><span class="o">.</span><span class="n">RED</span> <span class="ow">is</span> <span class="n">Color</span><span class="o">.</span><span class="n">RED</span>
|
||
<span class="go">True</span>
|
||
<span class="gp">>>> </span><span class="n">Color</span><span class="o">.</span><span class="n">RED</span> <span class="ow">is</span> <span class="n">Color</span><span class="o">.</span><span class="n">BLUE</span>
|
||
<span class="go">False</span>
|
||
<span class="gp">>>> </span><span class="n">Color</span><span class="o">.</span><span class="n">RED</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">Color</span><span class="o">.</span><span class="n">BLUE</span>
|
||
<span class="go">True</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>枚举值之间无法进行有序的比较。枚举的成员不是整数(另请参阅下文 <a class="reference internal" href="#intenum">IntEnum</a>):</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">Color</span><span class="o">.</span><span class="n">RED</span> <span class="o"><</span> <span class="n">Color</span><span class="o">.</span><span class="n">BLUE</span>
|
||
<span class="gt">Traceback (most recent call last):</span>
|
||
File <span class="nb">"<stdin>"</span>, line <span class="m">1</span>, in <span class="n"><module></span>
|
||
<span class="gr">TypeError</span>: <span class="n">'<' not supported between instances of 'Color' and 'Color'</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>相等性比较的定义如下:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">Color</span><span class="o">.</span><span class="n">BLUE</span> <span class="o">==</span> <span class="n">Color</span><span class="o">.</span><span class="n">RED</span>
|
||
<span class="go">False</span>
|
||
<span class="gp">>>> </span><span class="n">Color</span><span class="o">.</span><span class="n">BLUE</span> <span class="o">!=</span> <span class="n">Color</span><span class="o">.</span><span class="n">RED</span>
|
||
<span class="go">True</span>
|
||
<span class="gp">>>> </span><span class="n">Color</span><span class="o">.</span><span class="n">BLUE</span> <span class="o">==</span> <span class="n">Color</span><span class="o">.</span><span class="n">BLUE</span>
|
||
<span class="go">True</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>与非枚举值的比较将总是不等的(同样 <a class="reference internal" href="#enum.IntEnum" title="enum.IntEnum"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntEnum</span></code></a> 有意设计为其他的做法,参见下文):</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">Color</span><span class="o">.</span><span class="n">BLUE</span> <span class="o">==</span> <span class="mi">2</span>
|
||
<span class="go">False</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="allowed-members-and-attributes-of-enumerations">
|
||
<h2>合法的枚举成员和属性<a class="headerlink" href="#allowed-members-and-attributes-of-enumerations" title="永久链接至标题">¶</a></h2>
|
||
<p>以上示例使用整数作为枚举值。 使用整数相当简洁方便(并由 <a class="reference internal" href="#functional-api">Functional API</a> 默认提供),但并不强制要求使用。 在大部分用例中,开发者都关心枚举的实际值是什么。 但如果值 <em>确实</em> 重要,则枚举可以使用任意的值。</p>
|
||
<p>枚举是 Python 的类,可带有普通方法和特殊方法。假设有如下枚举:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span> <span class="nc">Mood</span><span class="p">(</span><span class="n">Enum</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">FUNKY</span> <span class="o">=</span> <span class="mi">1</span>
|
||
<span class="gp">... </span> <span class="n">HAPPY</span> <span class="o">=</span> <span class="mi">3</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">... </span> <span class="k">def</span> <span class="nf">describe</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="c1"># self is the member here</span>
|
||
<span class="gp">... </span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">value</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">... </span> <span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="k">return</span> <span class="s1">'my custom str! </span><span class="si">{0}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">... </span> <span class="nd">@classmethod</span>
|
||
<span class="gp">... </span> <span class="k">def</span> <span class="nf">favorite_mood</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="c1"># cls here is the enumeration</span>
|
||
<span class="gp">... </span> <span class="k">return</span> <span class="bp">cls</span><span class="o">.</span><span class="n">HAPPY</span>
|
||
<span class="gp">...</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>那么:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">Mood</span><span class="o">.</span><span class="n">favorite_mood</span><span class="p">()</span>
|
||
<span class="go"><Mood.HAPPY: 3></span>
|
||
<span class="gp">>>> </span><span class="n">Mood</span><span class="o">.</span><span class="n">HAPPY</span><span class="o">.</span><span class="n">describe</span><span class="p">()</span>
|
||
<span class="go">('HAPPY', 3)</span>
|
||
<span class="gp">>>> </span><span class="nb">str</span><span class="p">(</span><span class="n">Mood</span><span class="o">.</span><span class="n">FUNKY</span><span class="p">)</span>
|
||
<span class="go">'my custom str! 1'</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>合法的规则如下:以单下划线开头和结尾的名称是保留值,不能使用;在枚举中定义的其他所有属性都将成为该枚举的成员,但特殊方法(<a class="reference internal" href="../reference/datamodel.html#object.__str__" title="object.__str__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__str__()</span></code></a> 、<a class="reference internal" href="../reference/datamodel.html#object.__add__" title="object.__add__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__add__()</span></code></a> 等)、描述符(方法也是描述符)和在 <code class="xref py py-attr docutils literal notranslate"><span class="pre">_ignore_</span></code> 中列出的变量名除外。</p>
|
||
<p>注意:如果你的枚举定义了 <a class="reference internal" href="../reference/datamodel.html#object.__new__" title="object.__new__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__new__()</span></code></a> 和/或 <a class="reference internal" href="../reference/datamodel.html#object.__init__" title="object.__init__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__init__()</span></code></a> 那么指定给枚举成员的任何值都会被传入这些方法。 请参阅示例 <a class="reference internal" href="#planet">Planet</a>。</p>
|
||
</section>
|
||
<section id="restricted-enum-subclassing">
|
||
<h2>受限的 Enum 子类化<a class="headerlink" href="#restricted-enum-subclassing" title="永久链接至标题">¶</a></h2>
|
||
<p>一个新的 <a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 类必须基于一个 Enum 类,至多一个实体数据类型以及出于实际需要的任意多个基于 <a class="reference internal" href="functions.html#object" title="object"><code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></a> 的 mixin 类。 这些基类的顺序为:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">EnumName</span><span class="p">([</span><span class="n">mix</span><span class="o">-</span><span class="ow">in</span><span class="p">,</span> <span class="o">...</span><span class="p">,]</span> <span class="p">[</span><span class="n">data</span><span class="o">-</span><span class="nb">type</span><span class="p">,]</span> <span class="n">base</span><span class="o">-</span><span class="n">enum</span><span class="p">):</span>
|
||
<span class="k">pass</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>仅当未定义任何成员时,枚举类才允许被子类化。因此不得有以下写法:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span> <span class="nc">MoreColor</span><span class="p">(</span><span class="n">Color</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">PINK</span> <span class="o">=</span> <span class="mi">17</span>
|
||
<span class="gp">...</span>
|
||
<span class="gt">Traceback (most recent call last):</span>
|
||
<span class="c">...</span>
|
||
<span class="gr">TypeError</span>: <span class="n">Cannot extend enumerations</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>但以下代码是可以的:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span> <span class="nc">Foo</span><span class="p">(</span><span class="n">Enum</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="k">def</span> <span class="nf">some_behavior</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="k">pass</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="k">class</span> <span class="nc">Bar</span><span class="p">(</span><span class="n">Foo</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">HAPPY</span> <span class="o">=</span> <span class="mi">1</span>
|
||
<span class="gp">... </span> <span class="n">SAD</span> <span class="o">=</span> <span class="mi">2</span>
|
||
<span class="gp">...</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>如果定义了成员的枚举也能被子类化,则类型与实例的某些重要不可变规则将会被破坏。另一方面,一组枚举类共享某些操作也是合理的。(请参阅例程 <a class="reference internal" href="#orderedenum">OrderedEnum</a> )</p>
|
||
</section>
|
||
<section id="pickling">
|
||
<h2>打包(pickle)<a class="headerlink" href="#pickling" title="永久链接至标题">¶</a></h2>
|
||
<p>枚举类型可以被打包和解包:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">test.test_enum</span> <span class="kn">import</span> <span class="n">Fruit</span>
|
||
<span class="gp">>>> </span><span class="kn">from</span> <span class="nn">pickle</span> <span class="kn">import</span> <span class="n">dumps</span><span class="p">,</span> <span class="n">loads</span>
|
||
<span class="gp">>>> </span><span class="n">Fruit</span><span class="o">.</span><span class="n">TOMATO</span> <span class="ow">is</span> <span class="n">loads</span><span class="p">(</span><span class="n">dumps</span><span class="p">(</span><span class="n">Fruit</span><span class="o">.</span><span class="n">TOMATO</span><span class="p">))</span>
|
||
<span class="go">True</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>打包的常规限制同样适用于枚举类型:必须在模块的最高层级定义,因为解包操作要求可从该模块导入。</p>
|
||
<div class="admonition note">
|
||
<p class="admonition-title">注解</p>
|
||
<p>用 pickle 协议版本 4 可以轻松地将嵌入其他类中的枚举进行打包。</p>
|
||
</div>
|
||
<p>通过在枚举类中定义 <a class="reference internal" href="pickle.html#object.__reduce_ex__" title="object.__reduce_ex__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__reduce_ex__()</span></code></a> 可以对 Enum 成员的封存/解封方式进行修改。</p>
|
||
</section>
|
||
<section id="functional-api">
|
||
<h2>函数式 API<a class="headerlink" href="#functional-api" title="永久链接至标题">¶</a></h2>
|
||
<p><a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 类可调用并提供了以下函数式 API:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">Animal</span> <span class="o">=</span> <span class="n">Enum</span><span class="p">(</span><span class="s1">'Animal'</span><span class="p">,</span> <span class="s1">'ANT BEE CAT DOG'</span><span class="p">)</span>
|
||
<span class="gp">>>> </span><span class="n">Animal</span>
|
||
<span class="go"><enum 'Animal'></span>
|
||
<span class="gp">>>> </span><span class="n">Animal</span><span class="o">.</span><span class="n">ANT</span>
|
||
<span class="go"><Animal.ANT: 1></span>
|
||
<span class="gp">>>> </span><span class="n">Animal</span><span class="o">.</span><span class="n">ANT</span><span class="o">.</span><span class="n">value</span>
|
||
<span class="go">1</span>
|
||
<span class="gp">>>> </span><span class="nb">list</span><span class="p">(</span><span class="n">Animal</span><span class="p">)</span>
|
||
<span class="go">[<Animal.ANT: 1>, <Animal.BEE: 2>, <Animal.CAT: 3>, <Animal.DOG: 4>]</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>该 API 的语义类似于 <a class="reference internal" href="collections.html#collections.namedtuple" title="collections.namedtuple"><code class="xref py py-class docutils literal notranslate"><span class="pre">namedtuple</span></code></a>。调用 <a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 的第一个参数是枚举的名称。</p>
|
||
<p>第二个参数是枚举成员名称的 <em>来源</em>。可以是个用空格分隔的名称字符串、名称序列、表示键/值对的二元组的序列,或者名称到值的映射(如字典)。 最后两种可以为枚举赋任意值;其他类型则会自动赋成由 1 开始递增的整数值(利用 <code class="docutils literal notranslate"><span class="pre">start</span></code> 形参可指定为其他起始值)。返回值是一个派生自 <a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 的新类。换句话说,上述对 <code class="xref py py-class docutils literal notranslate"><span class="pre">Animal</span></code> 的赋值等价于:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span> <span class="nc">Animal</span><span class="p">(</span><span class="n">Enum</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">ANT</span> <span class="o">=</span> <span class="mi">1</span>
|
||
<span class="gp">... </span> <span class="n">BEE</span> <span class="o">=</span> <span class="mi">2</span>
|
||
<span class="gp">... </span> <span class="n">CAT</span> <span class="o">=</span> <span class="mi">3</span>
|
||
<span class="gp">... </span> <span class="n">DOG</span> <span class="o">=</span> <span class="mi">4</span>
|
||
<span class="gp">...</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>默认以 <code class="docutils literal notranslate"><span class="pre">1</span></code> 而以 <code class="docutils literal notranslate"><span class="pre">0</span></code> 作为起始数值的原因在于 <code class="docutils literal notranslate"><span class="pre">0</span></code> 的布尔值为 <code class="docutils literal notranslate"><span class="pre">False</span></code>,但所有枚举成员都应被求值为 <code class="docutils literal notranslate"><span class="pre">True</span></code>。</p>
|
||
<p>对使用功能性 API 创建的枚举执行封存可能会很麻烦,因为要使用帧堆栈的实现细节来尝试并找出枚举是在哪个模块中创建的(例如当你使用了另一个模块中的工具函数就可能失败,在 IronPython 或 Jython 上也可能无效)。 解决办法是显式地指定模块名称,如下所示:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">Animal</span> <span class="o">=</span> <span class="n">Enum</span><span class="p">(</span><span class="s1">'Animal'</span><span class="p">,</span> <span class="s1">'ANT BEE CAT DOG'</span><span class="p">,</span> <span class="n">module</span><span class="o">=</span><span class="vm">__name__</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<div class="admonition warning">
|
||
<p class="admonition-title">警告</p>
|
||
<p>如果未提供 <code class="docutils literal notranslate"><span class="pre">module</span></code>,且 Enum 无法确定是哪个模块,新的 Enum 成员将不可被解封;为了让错误尽量靠近源头,封存将被禁用。</p>
|
||
</div>
|
||
<p>新的 pickle 协议版本 4 在某些情况下同样依赖于 <a class="reference internal" href="stdtypes.html#definition.__qualname__" title="definition.__qualname__"><code class="xref py py-attr docutils literal notranslate"><span class="pre">__qualname__</span></code></a> 被设为特定位置以便 pickle 能够找到相应的类。 例如,类是否存在于全局作用域的 SomeData 类中:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">Animal</span> <span class="o">=</span> <span class="n">Enum</span><span class="p">(</span><span class="s1">'Animal'</span><span class="p">,</span> <span class="s1">'ANT BEE CAT DOG'</span><span class="p">,</span> <span class="n">qualname</span><span class="o">=</span><span class="s1">'SomeData.Animal'</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>完整的签名为:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">Enum</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="s1">'NewEnumName'</span><span class="p">,</span> <span class="n">names</span><span class="o">=<...></span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">module</span><span class="o">=</span><span class="s1">'...'</span><span class="p">,</span> <span class="n">qualname</span><span class="o">=</span><span class="s1">'...'</span><span class="p">,</span> <span class="nb">type</span><span class="o">=<</span><span class="n">mixed</span><span class="o">-</span><span class="ow">in</span> <span class="n">class</span><span class="o">></span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<dl class="field-list">
|
||
<dt class="field-odd">value</dt>
|
||
<dd class="field-odd"><p>将被新 Enum 类将记录为其名称的数据。</p>
|
||
</dd>
|
||
<dt class="field-even">names</dt>
|
||
<dd class="field-even"><p>Enum 的成员。 这可以是一个空格或逗号分隔的字符串 (起始值将为 1,除非另行指定):</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="s1">'RED GREEN BLUE'</span> <span class="o">|</span> <span class="s1">'RED,GREEN,BLUE'</span> <span class="o">|</span> <span class="s1">'RED, GREEN, BLUE'</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>或是一个名称的迭代器对象:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'RED'</span><span class="p">,</span> <span class="s1">'GREEN'</span><span class="p">,</span> <span class="s1">'BLUE'</span><span class="p">]</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>或是一个 (名称, 值) 对的迭代器对象:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="p">[(</span><span class="s1">'CYAN'</span><span class="p">,</span> <span class="mi">4</span><span class="p">),</span> <span class="p">(</span><span class="s1">'MAGENTA'</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span> <span class="p">(</span><span class="s1">'YELLOW'</span><span class="p">,</span> <span class="mi">6</span><span class="p">)]</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>或是一个映射对象:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="p">{</span><span class="s1">'CHARTREUSE'</span><span class="p">:</span> <span class="mi">7</span><span class="p">,</span> <span class="s1">'SEA_GREEN'</span><span class="p">:</span> <span class="mi">11</span><span class="p">,</span> <span class="s1">'ROSEMARY'</span><span class="p">:</span> <span class="mi">42</span><span class="p">}</span>
|
||
</pre></div>
|
||
</div>
|
||
</dd>
|
||
<dt class="field-odd">module</dt>
|
||
<dd class="field-odd"><p>新 Enum 类所在模块的名称。</p>
|
||
</dd>
|
||
<dt class="field-even">qualname</dt>
|
||
<dd class="field-even"><p>新 Enum 类在模块中的具体位置。</p>
|
||
</dd>
|
||
<dt class="field-odd">type</dt>
|
||
<dd class="field-odd"><p>要加入新 Enum 类的类型。</p>
|
||
</dd>
|
||
<dt class="field-even">start</dt>
|
||
<dd class="field-even"><p>当只传入名称时要使用的起始数值。</p>
|
||
</dd>
|
||
</dl>
|
||
<div class="versionchanged">
|
||
<p><span class="versionmodified changed">在 3.5 版更改: </span>增加了 <em>start</em> 形参。</p>
|
||
</div>
|
||
</section>
|
||
<section id="derived-enumerations">
|
||
<h2>派生的枚举<a class="headerlink" href="#derived-enumerations" title="永久链接至标题">¶</a></h2>
|
||
<section id="intenum">
|
||
<h3>IntEnum<a class="headerlink" href="#intenum" title="永久链接至标题">¶</a></h3>
|
||
<p>所提供的第一个变种 <a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 同时也是 <a class="reference internal" href="functions.html#int" title="int"><code class="xref py py-class docutils literal notranslate"><span class="pre">int</span></code></a> 的一个子类。 <a class="reference internal" href="#enum.IntEnum" title="enum.IntEnum"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntEnum</span></code></a> 的成员可与整数进行比较;通过扩展,不同类型的整数枚举也可以相互进行比较:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">enum</span> <span class="kn">import</span> <span class="n">IntEnum</span>
|
||
<span class="gp">>>> </span><span class="k">class</span> <span class="nc">Shape</span><span class="p">(</span><span class="n">IntEnum</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">CIRCLE</span> <span class="o">=</span> <span class="mi">1</span>
|
||
<span class="gp">... </span> <span class="n">SQUARE</span> <span class="o">=</span> <span class="mi">2</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="k">class</span> <span class="nc">Request</span><span class="p">(</span><span class="n">IntEnum</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">POST</span> <span class="o">=</span> <span class="mi">1</span>
|
||
<span class="gp">... </span> <span class="n">GET</span> <span class="o">=</span> <span class="mi">2</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="n">Shape</span> <span class="o">==</span> <span class="mi">1</span>
|
||
<span class="go">False</span>
|
||
<span class="gp">>>> </span><span class="n">Shape</span><span class="o">.</span><span class="n">CIRCLE</span> <span class="o">==</span> <span class="mi">1</span>
|
||
<span class="go">True</span>
|
||
<span class="gp">>>> </span><span class="n">Shape</span><span class="o">.</span><span class="n">CIRCLE</span> <span class="o">==</span> <span class="n">Request</span><span class="o">.</span><span class="n">POST</span>
|
||
<span class="go">True</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>不过,它们仍然不可与标准 <a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 枚举进行比较:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span> <span class="nc">Shape</span><span class="p">(</span><span class="n">IntEnum</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">CIRCLE</span> <span class="o">=</span> <span class="mi">1</span>
|
||
<span class="gp">... </span> <span class="n">SQUARE</span> <span class="o">=</span> <span class="mi">2</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="k">class</span> <span class="nc">Color</span><span class="p">(</span><span class="n">Enum</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">RED</span> <span class="o">=</span> <span class="mi">1</span>
|
||
<span class="gp">... </span> <span class="n">GREEN</span> <span class="o">=</span> <span class="mi">2</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="n">Shape</span><span class="o">.</span><span class="n">CIRCLE</span> <span class="o">==</span> <span class="n">Color</span><span class="o">.</span><span class="n">RED</span>
|
||
<span class="go">False</span>
|
||
</pre></div>
|
||
</div>
|
||
<p><a class="reference internal" href="#enum.IntEnum" title="enum.IntEnum"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntEnum</span></code></a> 值在其他方面的行为都如你预期的一样类似于整数:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">int</span><span class="p">(</span><span class="n">Shape</span><span class="o">.</span><span class="n">CIRCLE</span><span class="p">)</span>
|
||
<span class="go">1</span>
|
||
<span class="gp">>>> </span><span class="p">[</span><span class="s1">'a'</span><span class="p">,</span> <span class="s1">'b'</span><span class="p">,</span> <span class="s1">'c'</span><span class="p">][</span><span class="n">Shape</span><span class="o">.</span><span class="n">CIRCLE</span><span class="p">]</span>
|
||
<span class="go">'b'</span>
|
||
<span class="gp">>>> </span><span class="p">[</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">Shape</span><span class="o">.</span><span class="n">SQUARE</span><span class="p">)]</span>
|
||
<span class="go">[0, 1]</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="intflag">
|
||
<h3>IntFlag<a class="headerlink" href="#intflag" title="永久链接至标题">¶</a></h3>
|
||
<p>所提供的下一个 <a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 的变种 <a class="reference internal" href="#enum.IntFlag" title="enum.IntFlag"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntFlag</span></code></a> 同样是基于 <a class="reference internal" href="functions.html#int" title="int"><code class="xref py py-class docutils literal notranslate"><span class="pre">int</span></code></a> 的,不同之处在于 <a class="reference internal" href="#enum.IntFlag" title="enum.IntFlag"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntFlag</span></code></a> 成员可使用按位运算符 (&, |, ^, ~) 进行组合且结果仍然为 <a class="reference internal" href="#enum.IntFlag" title="enum.IntFlag"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntFlag</span></code></a> 成员。 如果,正如名称所表明的,<a class="reference internal" href="#enum.IntFlag" title="enum.IntFlag"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntFlag</span></code></a> 成员同时也是 <a class="reference internal" href="functions.html#int" title="int"><code class="xref py py-class docutils literal notranslate"><span class="pre">int</span></code></a> 的子类,并能在任何使用 <a class="reference internal" href="functions.html#int" title="int"><code class="xref py py-class docutils literal notranslate"><span class="pre">int</span></code></a> 的场合被使用。 <a class="reference internal" href="#enum.IntFlag" title="enum.IntFlag"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntFlag</span></code></a> 成员进行除按位运算以外的其他运算都将导致失去 <a class="reference internal" href="#enum.IntFlag" title="enum.IntFlag"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntFlag</span></code></a> 成员资格。</p>
|
||
<div class="versionadded">
|
||
<p><span class="versionmodified added">3.6 新版功能.</span></p>
|
||
</div>
|
||
<p>示例 <a class="reference internal" href="#enum.IntFlag" title="enum.IntFlag"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntFlag</span></code></a> 类:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">enum</span> <span class="kn">import</span> <span class="n">IntFlag</span>
|
||
<span class="gp">>>> </span><span class="k">class</span> <span class="nc">Perm</span><span class="p">(</span><span class="n">IntFlag</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">R</span> <span class="o">=</span> <span class="mi">4</span>
|
||
<span class="gp">... </span> <span class="n">W</span> <span class="o">=</span> <span class="mi">2</span>
|
||
<span class="gp">... </span> <span class="n">X</span> <span class="o">=</span> <span class="mi">1</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="n">Perm</span><span class="o">.</span><span class="n">R</span> <span class="o">|</span> <span class="n">Perm</span><span class="o">.</span><span class="n">W</span>
|
||
<span class="go"><Perm.R|W: 6></span>
|
||
<span class="gp">>>> </span><span class="n">Perm</span><span class="o">.</span><span class="n">R</span> <span class="o">+</span> <span class="n">Perm</span><span class="o">.</span><span class="n">W</span>
|
||
<span class="go">6</span>
|
||
<span class="gp">>>> </span><span class="n">RW</span> <span class="o">=</span> <span class="n">Perm</span><span class="o">.</span><span class="n">R</span> <span class="o">|</span> <span class="n">Perm</span><span class="o">.</span><span class="n">W</span>
|
||
<span class="gp">>>> </span><span class="n">Perm</span><span class="o">.</span><span class="n">R</span> <span class="ow">in</span> <span class="n">RW</span>
|
||
<span class="go">True</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>对于组合同样可以进行命名:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span> <span class="nc">Perm</span><span class="p">(</span><span class="n">IntFlag</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">R</span> <span class="o">=</span> <span class="mi">4</span>
|
||
<span class="gp">... </span> <span class="n">W</span> <span class="o">=</span> <span class="mi">2</span>
|
||
<span class="gp">... </span> <span class="n">X</span> <span class="o">=</span> <span class="mi">1</span>
|
||
<span class="gp">... </span> <span class="n">RWX</span> <span class="o">=</span> <span class="mi">7</span>
|
||
<span class="gp">>>> </span><span class="n">Perm</span><span class="o">.</span><span class="n">RWX</span>
|
||
<span class="go"><Perm.RWX: 7></span>
|
||
<span class="gp">>>> </span><span class="o">~</span><span class="n">Perm</span><span class="o">.</span><span class="n">RWX</span>
|
||
<span class="go"><Perm.-8: -8></span>
|
||
</pre></div>
|
||
</div>
|
||
<p><a class="reference internal" href="#enum.IntFlag" title="enum.IntFlag"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntFlag</span></code></a> 和 <a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 的另一个重要区别在于如果没有设置任何旗标(值为 0),则其布尔值为 <a class="reference internal" href="constants.html#False" title="False"><code class="xref py py-data docutils literal notranslate"><span class="pre">False</span></code></a>:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">Perm</span><span class="o">.</span><span class="n">R</span> <span class="o">&</span> <span class="n">Perm</span><span class="o">.</span><span class="n">X</span>
|
||
<span class="go"><Perm.0: 0></span>
|
||
<span class="gp">>>> </span><span class="nb">bool</span><span class="p">(</span><span class="n">Perm</span><span class="o">.</span><span class="n">R</span> <span class="o">&</span> <span class="n">Perm</span><span class="o">.</span><span class="n">X</span><span class="p">)</span>
|
||
<span class="go">False</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>由于 <a class="reference internal" href="#enum.IntFlag" title="enum.IntFlag"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntFlag</span></code></a> 成员同时也是 <a class="reference internal" href="functions.html#int" title="int"><code class="xref py py-class docutils literal notranslate"><span class="pre">int</span></code></a> 的子类,因此它们可以相互组合:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">Perm</span><span class="o">.</span><span class="n">X</span> <span class="o">|</span> <span class="mi">8</span>
|
||
<span class="go"><Perm.8|X: 9></span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="flag">
|
||
<h3>标志位<a class="headerlink" href="#flag" title="永久链接至标题">¶</a></h3>
|
||
<p>最后一个变体是 <a class="reference internal" href="#enum.Flag" title="enum.Flag"><code class="xref py py-class docutils literal notranslate"><span class="pre">Flag</span></code></a>。与 <a class="reference internal" href="#enum.IntFlag" title="enum.IntFlag"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntFlag</span></code></a> 类似,<a class="reference internal" href="#enum.Flag" title="enum.Flag"><code class="xref py py-class docutils literal notranslate"><span class="pre">Flag</span></code></a> 成员可用按位运算符 (&, |, ^, ~) 组合。与 <a class="reference internal" href="#enum.IntFlag" title="enum.IntFlag"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntFlag</span></code></a> 不同的是,它们不可与其它 <a class="reference internal" href="#enum.Flag" title="enum.Flag"><code class="xref py py-class docutils literal notranslate"><span class="pre">Flag</span></code></a> 枚举或 <a class="reference internal" href="functions.html#int" title="int"><code class="xref py py-class docutils literal notranslate"><span class="pre">int</span></code></a> 进行组合或比较。 虽然可以直接指定值,但推荐使用 <a class="reference internal" href="#enum.auto" title="enum.auto"><code class="xref py py-class docutils literal notranslate"><span class="pre">auto</span></code></a> 作为值来让 <a class="reference internal" href="#enum.Flag" title="enum.Flag"><code class="xref py py-class docutils literal notranslate"><span class="pre">Flag</span></code></a> 选择适当的值。</p>
|
||
<div class="versionadded">
|
||
<p><span class="versionmodified added">3.6 新版功能.</span></p>
|
||
</div>
|
||
<p>与 <a class="reference internal" href="#enum.IntFlag" title="enum.IntFlag"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntFlag</span></code></a> 类似,如果 <a class="reference internal" href="#enum.Flag" title="enum.Flag"><code class="xref py py-class docutils literal notranslate"><span class="pre">Flag</span></code></a> 成员的某种组合导致没有设置任何旗标,则其布尔值为 <a class="reference internal" href="constants.html#False" title="False"><code class="xref py py-data docutils literal notranslate"><span class="pre">False</span></code></a>:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">enum</span> <span class="kn">import</span> <span class="n">Flag</span><span class="p">,</span> <span class="n">auto</span>
|
||
<span class="gp">>>> </span><span class="k">class</span> <span class="nc">Color</span><span class="p">(</span><span class="n">Flag</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">RED</span> <span class="o">=</span> <span class="n">auto</span><span class="p">()</span>
|
||
<span class="gp">... </span> <span class="n">BLUE</span> <span class="o">=</span> <span class="n">auto</span><span class="p">()</span>
|
||
<span class="gp">... </span> <span class="n">GREEN</span> <span class="o">=</span> <span class="n">auto</span><span class="p">()</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="n">Color</span><span class="o">.</span><span class="n">RED</span> <span class="o">&</span> <span class="n">Color</span><span class="o">.</span><span class="n">GREEN</span>
|
||
<span class="go"><Color.0: 0></span>
|
||
<span class="gp">>>> </span><span class="nb">bool</span><span class="p">(</span><span class="n">Color</span><span class="o">.</span><span class="n">RED</span> <span class="o">&</span> <span class="n">Color</span><span class="o">.</span><span class="n">GREEN</span><span class="p">)</span>
|
||
<span class="go">False</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>单个标志的值应当为二的乘方 (1, 2, 4, 8, ...),标志的组合则无此限制:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span> <span class="nc">Color</span><span class="p">(</span><span class="n">Flag</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">RED</span> <span class="o">=</span> <span class="n">auto</span><span class="p">()</span>
|
||
<span class="gp">... </span> <span class="n">BLUE</span> <span class="o">=</span> <span class="n">auto</span><span class="p">()</span>
|
||
<span class="gp">... </span> <span class="n">GREEN</span> <span class="o">=</span> <span class="n">auto</span><span class="p">()</span>
|
||
<span class="gp">... </span> <span class="n">WHITE</span> <span class="o">=</span> <span class="n">RED</span> <span class="o">|</span> <span class="n">BLUE</span> <span class="o">|</span> <span class="n">GREEN</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="n">Color</span><span class="o">.</span><span class="n">WHITE</span>
|
||
<span class="go"><Color.WHITE: 7></span>
|
||
</pre></div>
|
||
</div>
|
||
<p>对 "no flags set" 条件指定一个名称并不会改变其布尔值:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span> <span class="nc">Color</span><span class="p">(</span><span class="n">Flag</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">BLACK</span> <span class="o">=</span> <span class="mi">0</span>
|
||
<span class="gp">... </span> <span class="n">RED</span> <span class="o">=</span> <span class="n">auto</span><span class="p">()</span>
|
||
<span class="gp">... </span> <span class="n">BLUE</span> <span class="o">=</span> <span class="n">auto</span><span class="p">()</span>
|
||
<span class="gp">... </span> <span class="n">GREEN</span> <span class="o">=</span> <span class="n">auto</span><span class="p">()</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="n">Color</span><span class="o">.</span><span class="n">BLACK</span>
|
||
<span class="go"><Color.BLACK: 0></span>
|
||
<span class="gp">>>> </span><span class="nb">bool</span><span class="p">(</span><span class="n">Color</span><span class="o">.</span><span class="n">BLACK</span><span class="p">)</span>
|
||
<span class="go">False</span>
|
||
</pre></div>
|
||
</div>
|
||
<div class="admonition note">
|
||
<p class="admonition-title">注解</p>
|
||
<p>对于大多数新代码,强烈推荐使用 <a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 和 <a class="reference internal" href="#enum.Flag" title="enum.Flag"><code class="xref py py-class docutils literal notranslate"><span class="pre">Flag</span></code></a>,因为 <a class="reference internal" href="#enum.IntEnum" title="enum.IntEnum"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntEnum</span></code></a> 和 <a class="reference internal" href="#enum.IntFlag" title="enum.IntFlag"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntFlag</span></code></a> 打破了枚举的某些语义约定(例如可以同整数进行比较,并因而导致此行为被传递给其他无关的枚举)。 <a class="reference internal" href="#enum.IntEnum" title="enum.IntEnum"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntEnum</span></code></a> 和 <a class="reference internal" href="#enum.IntFlag" title="enum.IntFlag"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntFlag</span></code></a> 的使用应当仅限于 <a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 和 <a class="reference internal" href="#enum.Flag" title="enum.Flag"><code class="xref py py-class docutils literal notranslate"><span class="pre">Flag</span></code></a> 无法使用的场合;例如,当使用枚举替代整数常量时,或是与其他系统进行交互操作时。</p>
|
||
</div>
|
||
</section>
|
||
<section id="others">
|
||
<h3>其他事项<a class="headerlink" href="#others" title="永久链接至标题">¶</a></h3>
|
||
<p>虽然 <a class="reference internal" href="#enum.IntEnum" title="enum.IntEnum"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntEnum</span></code></a> 是 <a class="reference internal" href="#module-enum" title="enum: Implementation of an enumeration class."><code class="xref py py-mod docutils literal notranslate"><span class="pre">enum</span></code></a> 模块的一部分,但要独立实现也应该相当容易:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">IntEnum</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">Enum</span><span class="p">):</span>
|
||
<span class="k">pass</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>这里演示了如何定义类似的派生枚举;例如一个混合了 <a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a> 而不是 <a class="reference internal" href="functions.html#int" title="int"><code class="xref py py-class docutils literal notranslate"><span class="pre">int</span></code></a> 的 <code class="xref py py-class docutils literal notranslate"><span class="pre">StrEnum</span></code>。</p>
|
||
<p>几条规则:</p>
|
||
<ol class="arabic simple">
|
||
<li><p>当子类化 <a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 时,在基类序列中的混合类型必须出现于 <a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 本身之前,如以上 <a class="reference internal" href="#enum.IntEnum" title="enum.IntEnum"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntEnum</span></code></a> 的例子所示。</p></li>
|
||
<li><p>虽然 <a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 可以拥有任意类型的成员,不过一旦你混合了附加类型,则所有成员必须为相应类型的值,如在上面的例子中即为 <a class="reference internal" href="functions.html#int" title="int"><code class="xref py py-class docutils literal notranslate"><span class="pre">int</span></code></a>。 此限制不适用于仅添加方法而未指定另一数据类型如 <a class="reference internal" href="functions.html#int" title="int"><code class="xref py py-class docutils literal notranslate"><span class="pre">int</span></code></a> 或 <a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a> 的混合类。</p></li>
|
||
<li><p>当混合了另一数据类型时,<code class="xref py py-attr docutils literal notranslate"><span class="pre">value</span></code> 属性会 <em>不同于</em> 枚举成员自身,但它们仍保持等价且比较结果也相等。</p></li>
|
||
<li><p>%-style formatting: <cite>%s</cite> 和 <cite>%r</cite> 会分别调用 <a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 类的 <a class="reference internal" href="../reference/datamodel.html#object.__str__" title="object.__str__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__str__()</span></code></a> 和 <a class="reference internal" href="../reference/datamodel.html#object.__repr__" title="object.__repr__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__repr__()</span></code></a>;其他代码 (例如表示 IntEnum 的 <cite>%i</cite> 或 <cite>%h</cite>) 会将枚举成员视为对应的混合类型。</p></li>
|
||
<li><p><a class="reference internal" href="../reference/lexical_analysis.html#f-strings"><span class="std std-ref">格式化字符串字面值</span></a>, <a class="reference internal" href="stdtypes.html#str.format" title="str.format"><code class="xref py py-meth docutils literal notranslate"><span class="pre">str.format()</span></code></a> 和 <a class="reference internal" href="functions.html#format" title="format"><code class="xref py py-func docutils literal notranslate"><span class="pre">format()</span></code></a> 将使用混合类型的 <a class="reference internal" href="../reference/datamodel.html#object.__format__" title="object.__format__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__format__()</span></code></a> 除非在子类中重载了 <a class="reference internal" href="../reference/datamodel.html#object.__str__" title="object.__str__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__str__()</span></code></a> 或 <a class="reference internal" href="../reference/datamodel.html#object.__format__" title="object.__format__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__format__()</span></code></a>,在这种情况下将使用被重载的方法或 <a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 的方法。 请使用 !s 和 !r 格式代码来强制使用 <a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 类的 <a class="reference internal" href="../reference/datamodel.html#object.__str__" title="object.__str__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__str__()</span></code></a> 和 <a class="reference internal" href="../reference/datamodel.html#object.__repr__" title="object.__repr__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__repr__()</span></code></a> 方法。</p></li>
|
||
</ol>
|
||
</section>
|
||
</section>
|
||
<section id="when-to-use-new-vs-init">
|
||
<h2>何时使用 <a class="reference internal" href="../reference/datamodel.html#object.__new__" title="object.__new__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__new__()</span></code></a> 与 <a class="reference internal" href="../reference/datamodel.html#object.__init__" title="object.__init__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__init__()</span></code></a><a class="headerlink" href="#when-to-use-new-vs-init" title="永久链接至标题">¶</a></h2>
|
||
<p>当你想要定制 <a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 成员的实际值时必须使用 <a class="reference internal" href="../reference/datamodel.html#object.__new__" title="object.__new__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__new__()</span></code></a>。 任何其他修改可以用 <a class="reference internal" href="../reference/datamodel.html#object.__new__" title="object.__new__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__new__()</span></code></a> 也可以用 <a class="reference internal" href="../reference/datamodel.html#object.__init__" title="object.__init__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__init__()</span></code></a>,应优先使用 <a class="reference internal" href="../reference/datamodel.html#object.__init__" title="object.__init__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__init__()</span></code></a>。</p>
|
||
<p>举例来说,如果你要向构造器传入多个条目,但只希望将其中一个作为值:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span> <span class="nc">Coordinate</span><span class="p">(</span><span class="nb">bytes</span><span class="p">,</span> <span class="n">Enum</span><span class="p">):</span>
|
||
<span class="gp">... </span><span class="w"> </span><span class="sd">"""</span>
|
||
<span class="gp">... </span><span class="sd"> Coordinate with binary codes that can be indexed by the int code.</span>
|
||
<span class="gp">... </span><span class="sd"> """</span>
|
||
<span class="gp">... </span> <span class="k">def</span> <span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">label</span><span class="p">,</span> <span class="n">unit</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">obj</span> <span class="o">=</span> <span class="nb">bytes</span><span class="o">.</span><span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="p">[</span><span class="n">value</span><span class="p">])</span>
|
||
<span class="gp">... </span> <span class="n">obj</span><span class="o">.</span><span class="n">_value_</span> <span class="o">=</span> <span class="n">value</span>
|
||
<span class="gp">... </span> <span class="n">obj</span><span class="o">.</span><span class="n">label</span> <span class="o">=</span> <span class="n">label</span>
|
||
<span class="gp">... </span> <span class="n">obj</span><span class="o">.</span><span class="n">unit</span> <span class="o">=</span> <span class="n">unit</span>
|
||
<span class="gp">... </span> <span class="k">return</span> <span class="n">obj</span>
|
||
<span class="gp">... </span> <span class="n">PX</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="s1">'P.X'</span><span class="p">,</span> <span class="s1">'km'</span><span class="p">)</span>
|
||
<span class="gp">... </span> <span class="n">PY</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="s1">'P.Y'</span><span class="p">,</span> <span class="s1">'km'</span><span class="p">)</span>
|
||
<span class="gp">... </span> <span class="n">VX</span> <span class="o">=</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="s1">'V.X'</span><span class="p">,</span> <span class="s1">'km/s'</span><span class="p">)</span>
|
||
<span class="gp">... </span> <span class="n">VY</span> <span class="o">=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="s1">'V.Y'</span><span class="p">,</span> <span class="s1">'km/s'</span><span class="p">)</span>
|
||
<span class="gp">...</span>
|
||
|
||
<span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="n">Coordinate</span><span class="p">[</span><span class="s1">'PY'</span><span class="p">])</span>
|
||
<span class="go">Coordinate.PY</span>
|
||
|
||
<span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="n">Coordinate</span><span class="p">(</span><span class="mi">3</span><span class="p">))</span>
|
||
<span class="go">Coordinate.VY</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="interesting-examples">
|
||
<h2>有趣的示例<a class="headerlink" href="#interesting-examples" title="永久链接至标题">¶</a></h2>
|
||
<p>虽然 <a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a>, <a class="reference internal" href="#enum.IntEnum" title="enum.IntEnum"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntEnum</span></code></a>, <a class="reference internal" href="#enum.IntFlag" title="enum.IntFlag"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntFlag</span></code></a> 和 <a class="reference internal" href="#enum.Flag" title="enum.Flag"><code class="xref py py-class docutils literal notranslate"><span class="pre">Flag</span></code></a> 预期可覆盖大多数应用场景,但它们无法覆盖全部。 这里有一些不同类型枚举的方案,它们可以被直接使用,或是作为自行创建的参考示例。</p>
|
||
<section id="omitting-values">
|
||
<h3>省略值<a class="headerlink" href="#omitting-values" title="永久链接至标题">¶</a></h3>
|
||
<p>在许多应用场景中人们都不关心枚举的实际值是什么。 有几个方式可以定义此种类型的简单枚举:</p>
|
||
<ul class="simple">
|
||
<li><p>使用 <a class="reference internal" href="#enum.auto" title="enum.auto"><code class="xref py py-class docutils literal notranslate"><span class="pre">auto</span></code></a> 的实例作为值</p></li>
|
||
<li><p>使用 <a class="reference internal" href="functions.html#object" title="object"><code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></a> 的实例作为值</p></li>
|
||
<li><p>使用描述性的字符串作为值</p></li>
|
||
<li><p>使用元组作为值并用自定义的 <a class="reference internal" href="../reference/datamodel.html#object.__new__" title="object.__new__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__new__()</span></code></a> 以一个 <a class="reference internal" href="functions.html#int" title="int"><code class="xref py py-class docutils literal notranslate"><span class="pre">int</span></code></a> 值来替代该元组</p></li>
|
||
</ul>
|
||
<p>使用以上任何一种方法均可向用户指明值并不重要,并且使人能够添加、移除或重排序成员而不必改变其余成员的数值。</p>
|
||
<p>无论你选择何种方法,你都应当提供一个 <a class="reference internal" href="functions.html#repr" title="repr"><code class="xref py py-meth docutils literal notranslate"><span class="pre">repr()</span></code></a> 并且它也需要隐藏(不重要的)值:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span> <span class="nc">NoValue</span><span class="p">(</span><span class="n">Enum</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="k">return</span> <span class="s1">'<</span><span class="si">%s</span><span class="s1">.</span><span class="si">%s</span><span class="s1">>'</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
|
||
<span class="gp">...</span>
|
||
</pre></div>
|
||
</div>
|
||
<section id="using-auto">
|
||
<h4>使用 <a class="reference internal" href="#enum.auto" title="enum.auto"><code class="xref py py-class docutils literal notranslate"><span class="pre">auto</span></code></a><a class="headerlink" href="#using-auto" title="永久链接至标题">¶</a></h4>
|
||
<p>使用 <a class="reference internal" href="#enum.auto" title="enum.auto"><code class="xref py py-class docutils literal notranslate"><span class="pre">auto</span></code></a> 的形式如下:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span> <span class="nc">Color</span><span class="p">(</span><span class="n">NoValue</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">RED</span> <span class="o">=</span> <span class="n">auto</span><span class="p">()</span>
|
||
<span class="gp">... </span> <span class="n">BLUE</span> <span class="o">=</span> <span class="n">auto</span><span class="p">()</span>
|
||
<span class="gp">... </span> <span class="n">GREEN</span> <span class="o">=</span> <span class="n">auto</span><span class="p">()</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="n">Color</span><span class="o">.</span><span class="n">GREEN</span>
|
||
<span class="go"><Color.GREEN></span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="using-object">
|
||
<h4>使用 <a class="reference internal" href="functions.html#object" title="object"><code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></a><a class="headerlink" href="#using-object" title="永久链接至标题">¶</a></h4>
|
||
<p>使用 <a class="reference internal" href="functions.html#object" title="object"><code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></a> 的形式如下:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span> <span class="nc">Color</span><span class="p">(</span><span class="n">NoValue</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">RED</span> <span class="o">=</span> <span class="nb">object</span><span class="p">()</span>
|
||
<span class="gp">... </span> <span class="n">GREEN</span> <span class="o">=</span> <span class="nb">object</span><span class="p">()</span>
|
||
<span class="gp">... </span> <span class="n">BLUE</span> <span class="o">=</span> <span class="nb">object</span><span class="p">()</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="n">Color</span><span class="o">.</span><span class="n">GREEN</span>
|
||
<span class="go"><Color.GREEN></span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="using-a-descriptive-string">
|
||
<h4>使用描述性字符串<a class="headerlink" href="#using-a-descriptive-string" title="永久链接至标题">¶</a></h4>
|
||
<p>使用字符串作为值的形式如下:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span> <span class="nc">Color</span><span class="p">(</span><span class="n">NoValue</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">RED</span> <span class="o">=</span> <span class="s1">'stop'</span>
|
||
<span class="gp">... </span> <span class="n">GREEN</span> <span class="o">=</span> <span class="s1">'go'</span>
|
||
<span class="gp">... </span> <span class="n">BLUE</span> <span class="o">=</span> <span class="s1">'too fast!'</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="n">Color</span><span class="o">.</span><span class="n">GREEN</span>
|
||
<span class="go"><Color.GREEN></span>
|
||
<span class="gp">>>> </span><span class="n">Color</span><span class="o">.</span><span class="n">GREEN</span><span class="o">.</span><span class="n">value</span>
|
||
<span class="go">'go'</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="using-a-custom-new">
|
||
<h4>使用自定义的 <a class="reference internal" href="../reference/datamodel.html#object.__new__" title="object.__new__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__new__()</span></code></a><a class="headerlink" href="#using-a-custom-new" title="永久链接至标题">¶</a></h4>
|
||
<p>使用自动编号 <a class="reference internal" href="../reference/datamodel.html#object.__new__" title="object.__new__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__new__()</span></code></a> 的形式如下:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span> <span class="nc">AutoNumber</span><span class="p">(</span><span class="n">NoValue</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="k">def</span> <span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">value</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="n">__members__</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
|
||
<span class="gp">... </span> <span class="n">obj</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">)</span>
|
||
<span class="gp">... </span> <span class="n">obj</span><span class="o">.</span><span class="n">_value_</span> <span class="o">=</span> <span class="n">value</span>
|
||
<span class="gp">... </span> <span class="k">return</span> <span class="n">obj</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="k">class</span> <span class="nc">Color</span><span class="p">(</span><span class="n">AutoNumber</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">RED</span> <span class="o">=</span> <span class="p">()</span>
|
||
<span class="gp">... </span> <span class="n">GREEN</span> <span class="o">=</span> <span class="p">()</span>
|
||
<span class="gp">... </span> <span class="n">BLUE</span> <span class="o">=</span> <span class="p">()</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="n">Color</span><span class="o">.</span><span class="n">GREEN</span>
|
||
<span class="go"><Color.GREEN></span>
|
||
<span class="gp">>>> </span><span class="n">Color</span><span class="o">.</span><span class="n">GREEN</span><span class="o">.</span><span class="n">value</span>
|
||
<span class="go">2</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>要实现更通用的 <code class="docutils literal notranslate"><span class="pre">AutoNumber</span></code>,请添加 <code class="docutils literal notranslate"><span class="pre">*args</span></code> 到签名中:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span> <span class="nc">AutoNumber</span><span class="p">(</span><span class="n">NoValue</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="k">def</span> <span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span> <span class="c1"># this is the only change from above</span>
|
||
<span class="gp">... </span> <span class="n">value</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="n">__members__</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
|
||
<span class="gp">... </span> <span class="n">obj</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">)</span>
|
||
<span class="gp">... </span> <span class="n">obj</span><span class="o">.</span><span class="n">_value_</span> <span class="o">=</span> <span class="n">value</span>
|
||
<span class="gp">... </span> <span class="k">return</span> <span class="n">obj</span>
|
||
<span class="gp">...</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>这样当你从 <code class="docutils literal notranslate"><span class="pre">AutoNumber</span></code> 继承时你将可以编写你自己的 <code class="docutils literal notranslate"><span class="pre">__init__</span></code> 来处理任何附加参数:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span> <span class="nc">Swatch</span><span class="p">(</span><span class="n">AutoNumber</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pantone</span><span class="o">=</span><span class="s1">'unknown'</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="bp">self</span><span class="o">.</span><span class="n">pantone</span> <span class="o">=</span> <span class="n">pantone</span>
|
||
<span class="gp">... </span> <span class="n">AUBURN</span> <span class="o">=</span> <span class="s1">'3497'</span>
|
||
<span class="gp">... </span> <span class="n">SEA_GREEN</span> <span class="o">=</span> <span class="s1">'1246'</span>
|
||
<span class="gp">... </span> <span class="n">BLEACHED_CORAL</span> <span class="o">=</span> <span class="p">()</span> <span class="c1"># New color, no Pantone code yet!</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="n">Swatch</span><span class="o">.</span><span class="n">SEA_GREEN</span>
|
||
<span class="go"><Swatch.SEA_GREEN: 2></span>
|
||
<span class="gp">>>> </span><span class="n">Swatch</span><span class="o">.</span><span class="n">SEA_GREEN</span><span class="o">.</span><span class="n">pantone</span>
|
||
<span class="go">'1246'</span>
|
||
<span class="gp">>>> </span><span class="n">Swatch</span><span class="o">.</span><span class="n">BLEACHED_CORAL</span><span class="o">.</span><span class="n">pantone</span>
|
||
<span class="go">'unknown'</span>
|
||
</pre></div>
|
||
</div>
|
||
<div class="admonition note">
|
||
<p class="admonition-title">注解</p>
|
||
<p>如果定义了 <a class="reference internal" href="../reference/datamodel.html#object.__new__" title="object.__new__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__new__()</span></code></a> 则它会在创建 Enum 成员期间被使用;随后它将被 Enum 的 <a class="reference internal" href="../reference/datamodel.html#object.__new__" title="object.__new__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__new__()</span></code></a> 所替换,该方法会在类创建后被用来查找现有成员。</p>
|
||
</div>
|
||
</section>
|
||
</section>
|
||
<section id="orderedenum">
|
||
<h3>OrderedEnum<a class="headerlink" href="#orderedenum" title="永久链接至标题">¶</a></h3>
|
||
<p>一个有序枚举,它不是基于 <a class="reference internal" href="#enum.IntEnum" title="enum.IntEnum"><code class="xref py py-class docutils literal notranslate"><span class="pre">IntEnum</span></code></a>,因此保持了正常的 <a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 不变特性(例如不可与其他枚举进行比较):</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span> <span class="nc">OrderedEnum</span><span class="p">(</span><span class="n">Enum</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="k">def</span> <span class="fm">__ge__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span> <span class="ow">is</span> <span class="n">other</span><span class="o">.</span><span class="vm">__class__</span><span class="p">:</span>
|
||
<span class="gp">... </span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">value</span> <span class="o">>=</span> <span class="n">other</span><span class="o">.</span><span class="n">value</span>
|
||
<span class="gp">... </span> <span class="k">return</span> <span class="bp">NotImplemented</span>
|
||
<span class="gp">... </span> <span class="k">def</span> <span class="fm">__gt__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span> <span class="ow">is</span> <span class="n">other</span><span class="o">.</span><span class="vm">__class__</span><span class="p">:</span>
|
||
<span class="gp">... </span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">value</span> <span class="o">></span> <span class="n">other</span><span class="o">.</span><span class="n">value</span>
|
||
<span class="gp">... </span> <span class="k">return</span> <span class="bp">NotImplemented</span>
|
||
<span class="gp">... </span> <span class="k">def</span> <span class="fm">__le__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span> <span class="ow">is</span> <span class="n">other</span><span class="o">.</span><span class="vm">__class__</span><span class="p">:</span>
|
||
<span class="gp">... </span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">value</span> <span class="o"><=</span> <span class="n">other</span><span class="o">.</span><span class="n">value</span>
|
||
<span class="gp">... </span> <span class="k">return</span> <span class="bp">NotImplemented</span>
|
||
<span class="gp">... </span> <span class="k">def</span> <span class="fm">__lt__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span> <span class="ow">is</span> <span class="n">other</span><span class="o">.</span><span class="vm">__class__</span><span class="p">:</span>
|
||
<span class="gp">... </span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">value</span> <span class="o"><</span> <span class="n">other</span><span class="o">.</span><span class="n">value</span>
|
||
<span class="gp">... </span> <span class="k">return</span> <span class="bp">NotImplemented</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="k">class</span> <span class="nc">Grade</span><span class="p">(</span><span class="n">OrderedEnum</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">A</span> <span class="o">=</span> <span class="mi">5</span>
|
||
<span class="gp">... </span> <span class="n">B</span> <span class="o">=</span> <span class="mi">4</span>
|
||
<span class="gp">... </span> <span class="n">C</span> <span class="o">=</span> <span class="mi">3</span>
|
||
<span class="gp">... </span> <span class="n">D</span> <span class="o">=</span> <span class="mi">2</span>
|
||
<span class="gp">... </span> <span class="n">F</span> <span class="o">=</span> <span class="mi">1</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="n">Grade</span><span class="o">.</span><span class="n">C</span> <span class="o"><</span> <span class="n">Grade</span><span class="o">.</span><span class="n">A</span>
|
||
<span class="go">True</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="duplicatefreeenum">
|
||
<h3>DuplicateFreeEnum<a class="headerlink" href="#duplicatefreeenum" title="永久链接至标题">¶</a></h3>
|
||
<p>如果发现重复的成员名称则将引发错误而不是创建别名:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span> <span class="nc">DuplicateFreeEnum</span><span class="p">(</span><span class="n">Enum</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="bp">cls</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span>
|
||
<span class="gp">... </span> <span class="k">if</span> <span class="nb">any</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span> <span class="o">==</span> <span class="n">e</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="bp">cls</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">a</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span>
|
||
<span class="gp">... </span> <span class="n">e</span> <span class="o">=</span> <span class="bp">cls</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">)</span><span class="o">.</span><span class="n">name</span>
|
||
<span class="gp">... </span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
|
||
<span class="gp">... </span> <span class="s2">"aliases not allowed in DuplicateFreeEnum: </span><span class="si">%r</span><span class="s2"> --> </span><span class="si">%r</span><span class="s2">"</span>
|
||
<span class="gp">... </span> <span class="o">%</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">e</span><span class="p">))</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="k">class</span> <span class="nc">Color</span><span class="p">(</span><span class="n">DuplicateFreeEnum</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">RED</span> <span class="o">=</span> <span class="mi">1</span>
|
||
<span class="gp">... </span> <span class="n">GREEN</span> <span class="o">=</span> <span class="mi">2</span>
|
||
<span class="gp">... </span> <span class="n">BLUE</span> <span class="o">=</span> <span class="mi">3</span>
|
||
<span class="gp">... </span> <span class="n">GRENE</span> <span class="o">=</span> <span class="mi">2</span>
|
||
<span class="gp">...</span>
|
||
<span class="gt">Traceback (most recent call last):</span>
|
||
<span class="c">...</span>
|
||
<span class="gr">ValueError</span>: <span class="n">aliases not allowed in DuplicateFreeEnum: 'GRENE' --> 'GREEN'</span>
|
||
</pre></div>
|
||
</div>
|
||
<div class="admonition note">
|
||
<p class="admonition-title">注解</p>
|
||
<p>这个例子适用于子类化 Enum 来添加或改变禁用别名以及其他行为。 如果需要的改变只是禁用别名,也可以选择使用 <a class="reference internal" href="#enum.unique" title="enum.unique"><code class="xref py py-func docutils literal notranslate"><span class="pre">unique()</span></code></a> 装饰器。</p>
|
||
</div>
|
||
</section>
|
||
<section id="planet">
|
||
<h3>Planet<a class="headerlink" href="#planet" title="永久链接至标题">¶</a></h3>
|
||
<p>如果定义了 <a class="reference internal" href="../reference/datamodel.html#object.__new__" title="object.__new__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__new__()</span></code></a> 或 <a class="reference internal" href="../reference/datamodel.html#object.__init__" title="object.__init__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__init__()</span></code></a> 则枚举成员的值将被传给这些方法:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span> <span class="nc">Planet</span><span class="p">(</span><span class="n">Enum</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">MERCURY</span> <span class="o">=</span> <span class="p">(</span><span class="mf">3.303e+23</span><span class="p">,</span> <span class="mf">2.4397e6</span><span class="p">)</span>
|
||
<span class="gp">... </span> <span class="n">VENUS</span> <span class="o">=</span> <span class="p">(</span><span class="mf">4.869e+24</span><span class="p">,</span> <span class="mf">6.0518e6</span><span class="p">)</span>
|
||
<span class="gp">... </span> <span class="n">EARTH</span> <span class="o">=</span> <span class="p">(</span><span class="mf">5.976e+24</span><span class="p">,</span> <span class="mf">6.37814e6</span><span class="p">)</span>
|
||
<span class="gp">... </span> <span class="n">MARS</span> <span class="o">=</span> <span class="p">(</span><span class="mf">6.421e+23</span><span class="p">,</span> <span class="mf">3.3972e6</span><span class="p">)</span>
|
||
<span class="gp">... </span> <span class="n">JUPITER</span> <span class="o">=</span> <span class="p">(</span><span class="mf">1.9e+27</span><span class="p">,</span> <span class="mf">7.1492e7</span><span class="p">)</span>
|
||
<span class="gp">... </span> <span class="n">SATURN</span> <span class="o">=</span> <span class="p">(</span><span class="mf">5.688e+26</span><span class="p">,</span> <span class="mf">6.0268e7</span><span class="p">)</span>
|
||
<span class="gp">... </span> <span class="n">URANUS</span> <span class="o">=</span> <span class="p">(</span><span class="mf">8.686e+25</span><span class="p">,</span> <span class="mf">2.5559e7</span><span class="p">)</span>
|
||
<span class="gp">... </span> <span class="n">NEPTUNE</span> <span class="o">=</span> <span class="p">(</span><span class="mf">1.024e+26</span><span class="p">,</span> <span class="mf">2.4746e7</span><span class="p">)</span>
|
||
<span class="gp">... </span> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mass</span><span class="p">,</span> <span class="n">radius</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="bp">self</span><span class="o">.</span><span class="n">mass</span> <span class="o">=</span> <span class="n">mass</span> <span class="c1"># in kilograms</span>
|
||
<span class="gp">... </span> <span class="bp">self</span><span class="o">.</span><span class="n">radius</span> <span class="o">=</span> <span class="n">radius</span> <span class="c1"># in meters</span>
|
||
<span class="gp">... </span> <span class="nd">@property</span>
|
||
<span class="gp">... </span> <span class="k">def</span> <span class="nf">surface_gravity</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="c1"># universal gravitational constant (m3 kg-1 s-2)</span>
|
||
<span class="gp">... </span> <span class="n">G</span> <span class="o">=</span> <span class="mf">6.67300E-11</span>
|
||
<span class="gp">... </span> <span class="k">return</span> <span class="n">G</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">mass</span> <span class="o">/</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">radius</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">radius</span><span class="p">)</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="n">Planet</span><span class="o">.</span><span class="n">EARTH</span><span class="o">.</span><span class="n">value</span>
|
||
<span class="go">(5.976e+24, 6378140.0)</span>
|
||
<span class="gp">>>> </span><span class="n">Planet</span><span class="o">.</span><span class="n">EARTH</span><span class="o">.</span><span class="n">surface_gravity</span>
|
||
<span class="go">9.802652743337129</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="timeperiod">
|
||
<h3>TimePeriod<a class="headerlink" href="#timeperiod" title="永久链接至标题">¶</a></h3>
|
||
<p>一个演示如何使用 <code class="xref py py-attr docutils literal notranslate"><span class="pre">_ignore_</span></code> 属性的例子:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">timedelta</span>
|
||
<span class="gp">>>> </span><span class="k">class</span> <span class="nc">Period</span><span class="p">(</span><span class="n">timedelta</span><span class="p">,</span> <span class="n">Enum</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="s2">"different lengths of time"</span>
|
||
<span class="gp">... </span> <span class="n">_ignore_</span> <span class="o">=</span> <span class="s1">'Period i'</span>
|
||
<span class="gp">... </span> <span class="n">Period</span> <span class="o">=</span> <span class="nb">vars</span><span class="p">()</span>
|
||
<span class="gp">... </span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">367</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">Period</span><span class="p">[</span><span class="s1">'day_</span><span class="si">%d</span><span class="s1">'</span> <span class="o">%</span> <span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="nb">list</span><span class="p">(</span><span class="n">Period</span><span class="p">)[:</span><span class="mi">2</span><span class="p">]</span>
|
||
<span class="go">[<Period.day_0: datetime.timedelta(0)>, <Period.day_1: datetime.timedelta(days=1)>]</span>
|
||
<span class="gp">>>> </span><span class="nb">list</span><span class="p">(</span><span class="n">Period</span><span class="p">)[</span><span class="o">-</span><span class="mi">2</span><span class="p">:]</span>
|
||
<span class="go">[<Period.day_365: datetime.timedelta(days=365)>, <Period.day_366: datetime.timedelta(days=366)>]</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
</section>
|
||
<section id="how-are-enums-different">
|
||
<h2>各种枚举有何区别?<a class="headerlink" href="#how-are-enums-different" title="永久链接至标题">¶</a></h2>
|
||
<p>枚举具有自定义的元类,它会影响所派生枚举类及其实例(成员)的各个方面。</p>
|
||
<section id="enum-classes">
|
||
<h3>枚举类<a class="headerlink" href="#enum-classes" title="永久链接至标题">¶</a></h3>
|
||
<p><code class="xref py py-class docutils literal notranslate"><span class="pre">EnumMeta</span></code> 元类负责提供 <a class="reference internal" href="../reference/datamodel.html#object.__contains__" title="object.__contains__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__contains__()</span></code></a>, <a class="reference internal" href="../reference/datamodel.html#object.__dir__" title="object.__dir__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__dir__()</span></code></a>, <a class="reference internal" href="../reference/datamodel.html#object.__iter__" title="object.__iter__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__iter__()</span></code></a> 及其他方法以允许用户通过 <a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 类来完成一般类做不到的事情,例如 <cite>list(Color)</cite> 或 <cite>some_enum_var in Color</cite>。 <code class="xref py py-class docutils literal notranslate"><span class="pre">EnumMeta</span></code> 会负责确保最终 <a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 类中的各种其他方法是正确的 (例如 <a class="reference internal" href="../reference/datamodel.html#object.__new__" title="object.__new__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__new__()</span></code></a>, <a class="reference internal" href="pickle.html#object.__getnewargs__" title="object.__getnewargs__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__getnewargs__()</span></code></a>, <a class="reference internal" href="../reference/datamodel.html#object.__str__" title="object.__str__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__str__()</span></code></a> 和 <a class="reference internal" href="../reference/datamodel.html#object.__repr__" title="object.__repr__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__repr__()</span></code></a>)。</p>
|
||
</section>
|
||
<section id="enum-members-aka-instances">
|
||
<h3>枚举成员(即实例)<a class="headerlink" href="#enum-members-aka-instances" title="永久链接至标题">¶</a></h3>
|
||
<p>有关枚举成员最有趣的特点是它们都是单例对象。 <code class="xref py py-class docutils literal notranslate"><span class="pre">EnumMeta</span></code> 会在创建 <a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 类本身时将它们全部创建完成,然后准备好一个自定义的 <a class="reference internal" href="../reference/datamodel.html#object.__new__" title="object.__new__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__new__()</span></code></a>,通过只返回现有的成员实例来确保不会再实例化新的对象。</p>
|
||
</section>
|
||
<section id="finer-points">
|
||
<h3>细节要点<a class="headerlink" href="#finer-points" title="永久链接至标题">¶</a></h3>
|
||
<section id="supported-dunder-names">
|
||
<h4>支持的 <code class="docutils literal notranslate"><span class="pre">__dunder__</span></code> 名称<a class="headerlink" href="#supported-dunder-names" title="永久链接至标题">¶</a></h4>
|
||
<p><code class="xref py py-attr docutils literal notranslate"><span class="pre">__members__</span></code> 是一个 <code class="docutils literal notranslate"><span class="pre">member_name</span></code>:<code class="docutils literal notranslate"><span class="pre">member</span></code> 条目的只读有序映射。 它只在类上可用。</p>
|
||
<p>如果指定了 <a class="reference internal" href="../reference/datamodel.html#object.__new__" title="object.__new__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__new__()</span></code></a>,它必须创建并返回枚举成员;相应地设定成员的 <code class="xref py py-attr docutils literal notranslate"><span class="pre">_value_</span></code> 也是一个很好的主意。 一旦所有成员都创建完成它就不会再被使用。</p>
|
||
</section>
|
||
<section id="supported-sunder-names">
|
||
<h4>支持的 <code class="docutils literal notranslate"><span class="pre">_sunder_</span></code> 名称<a class="headerlink" href="#supported-sunder-names" title="永久链接至标题">¶</a></h4>
|
||
<ul class="simple">
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">_name_</span></code> -- 成员的名称</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">_value_</span></code> -- 成员的值;可以在 <code class="docutils literal notranslate"><span class="pre">__new__</span></code> 中设置 / 修改</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">_missing_</span></code> -- 当未发现某个值时所使用的查找函数;可被重写</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">_ignore_</span></code> -- 一个名称列表,可以为 <a class="reference internal" href="stdtypes.html#list" title="list"><code class="xref py py-func docutils literal notranslate"><span class="pre">list()</span></code></a> 或 <a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-func docutils literal notranslate"><span class="pre">str()</span></code></a>,它将不会被转化为成员,并会从最终类中被移除</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">_order_</span></code> -- 用于 Python 2/3 代码以确保成员顺序一致(类属性,在类创建期间会被移除)</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">_generate_next_value_</span></code> -- <a class="reference internal" href="#functional-api">Functional API</a> 和 <a class="reference internal" href="#enum.auto" title="enum.auto"><code class="xref py py-class docutils literal notranslate"><span class="pre">auto</span></code></a> 用它为枚举成员获取适当的值;可被重写</p></li>
|
||
</ul>
|
||
<div class="versionadded">
|
||
<p><span class="versionmodified added">3.6 新版功能: </span><code class="docutils literal notranslate"><span class="pre">_missing_</span></code>, <code class="docutils literal notranslate"><span class="pre">_order_</span></code>, <code class="docutils literal notranslate"><span class="pre">_generate_next_value_</span></code></p>
|
||
</div>
|
||
<div class="versionadded">
|
||
<p><span class="versionmodified added">3.7 新版功能: </span><code class="docutils literal notranslate"><span class="pre">_ignore_</span></code></p>
|
||
</div>
|
||
<p>用来帮助 Python 2 / Python 3 代码保持同步提供 <code class="xref py py-attr docutils literal notranslate"><span class="pre">_order_</span></code> 属性。 它将与枚举的实际顺序进行对照检查,如果两者不匹配则会引发错误:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span> <span class="nc">Color</span><span class="p">(</span><span class="n">Enum</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">_order_</span> <span class="o">=</span> <span class="s1">'RED GREEN BLUE'</span>
|
||
<span class="gp">... </span> <span class="n">RED</span> <span class="o">=</span> <span class="mi">1</span>
|
||
<span class="gp">... </span> <span class="n">BLUE</span> <span class="o">=</span> <span class="mi">3</span>
|
||
<span class="gp">... </span> <span class="n">GREEN</span> <span class="o">=</span> <span class="mi">2</span>
|
||
<span class="gp">...</span>
|
||
<span class="gt">Traceback (most recent call last):</span>
|
||
<span class="c">...</span>
|
||
<span class="gr">TypeError</span>: <span class="n">member order does not match _order_</span>
|
||
</pre></div>
|
||
</div>
|
||
<div class="admonition note">
|
||
<p class="admonition-title">注解</p>
|
||
<p>在 Python 2 代码中 <code class="xref py py-attr docutils literal notranslate"><span class="pre">_order_</span></code> 属性是必须的,因为定义顺序在被记录之前就会丢失。</p>
|
||
</div>
|
||
</section>
|
||
<section id="enum-member-type">
|
||
<h4><code class="docutils literal notranslate"><span class="pre">Enum</span></code> 成员类型<a class="headerlink" href="#enum-member-type" title="永久链接至标题">¶</a></h4>
|
||
<p><a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 成员是其 <a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 类的实例,一般通过 <code class="docutils literal notranslate"><span class="pre">EnumClass.member</span></code> 的形式来访问。 在特定情况下它们也可通过 <code class="docutils literal notranslate"><span class="pre">EnumClass.member.member</span></code> 的形式来访问,但你绝对不应这样做,因为查找可能失败,或者更糟糕地返回你所查找的 <a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 成员以外的对象(这也是成员应使用全大写名称的另一个好理由):</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span> <span class="nc">FieldTypes</span><span class="p">(</span><span class="n">Enum</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">name</span> <span class="o">=</span> <span class="mi">0</span>
|
||
<span class="gp">... </span> <span class="n">value</span> <span class="o">=</span> <span class="mi">1</span>
|
||
<span class="gp">... </span> <span class="n">size</span> <span class="o">=</span> <span class="mi">2</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="n">FieldTypes</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">size</span>
|
||
<span class="go"><FieldTypes.size: 2></span>
|
||
<span class="gp">>>> </span><span class="n">FieldTypes</span><span class="o">.</span><span class="n">size</span><span class="o">.</span><span class="n">value</span>
|
||
<span class="go">2</span>
|
||
</pre></div>
|
||
</div>
|
||
<div class="versionchanged">
|
||
<p><span class="versionmodified changed">在 3.5 版更改.</span></p>
|
||
</div>
|
||
</section>
|
||
<section id="boolean-value-of-enum-classes-and-members">
|
||
<h4><code class="docutils literal notranslate"><span class="pre">Enum</span></code> 类和成员的布尔值<a class="headerlink" href="#boolean-value-of-enum-classes-and-members" title="永久链接至标题">¶</a></h4>
|
||
<p>混合了非 <a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 类型(例如 <a class="reference internal" href="functions.html#int" title="int"><code class="xref py py-class docutils literal notranslate"><span class="pre">int</span></code></a>, <a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a> 等)的 <a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 成员会按所混合类型的规则被求值;在其他情况下,所有成员都将被求值为 <a class="reference internal" href="constants.html#True" title="True"><code class="xref py py-data docutils literal notranslate"><span class="pre">True</span></code></a>。 要使你的自定义 Enum 的布尔值取决于成员的值,请在你的类中添加以下代码:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="fm">__bool__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<p><a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 类总是会被求值为 <a class="reference internal" href="constants.html#True" title="True"><code class="xref py py-data docutils literal notranslate"><span class="pre">True</span></code></a>。</p>
|
||
</section>
|
||
<section id="enum-classes-with-methods">
|
||
<h4>带有方法的 <code class="docutils literal notranslate"><span class="pre">Enum</span></code> 类<a class="headerlink" href="#enum-classes-with-methods" title="永久链接至标题">¶</a></h4>
|
||
<p>如果你为你的 <a class="reference internal" href="#enum.Enum" title="enum.Enum"><code class="xref py py-class docutils literal notranslate"><span class="pre">Enum</span></code></a> 子类添加了额外的方法,如同上述的 <a class="reference internal" href="#planet">Planet</a> 类一样,这些方法将在对成员执行 <a class="reference internal" href="functions.html#dir" title="dir"><code class="xref py py-func docutils literal notranslate"><span class="pre">dir()</span></code></a> 时显示出来,但对类执行时则不会显示:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">dir</span><span class="p">(</span><span class="n">Planet</span><span class="p">)</span>
|
||
<span class="go">['EARTH', 'JUPITER', 'MARS', 'MERCURY', 'NEPTUNE', 'SATURN', 'URANUS', 'VENUS', '__class__', '__doc__', '__members__', '__module__']</span>
|
||
<span class="gp">>>> </span><span class="nb">dir</span><span class="p">(</span><span class="n">Planet</span><span class="o">.</span><span class="n">EARTH</span><span class="p">)</span>
|
||
<span class="go">['__class__', '__doc__', '__module__', 'name', 'surface_gravity', 'value']</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="combining-members-of-flag">
|
||
<h4>组合 <code class="docutils literal notranslate"><span class="pre">Flag</span></code> 的成员<a class="headerlink" href="#combining-members-of-flag" title="永久链接至标题">¶</a></h4>
|
||
<p>如果 Flag 成员的某种组合未被命名,则 <a class="reference internal" href="functions.html#repr" title="repr"><code class="xref py py-func docutils literal notranslate"><span class="pre">repr()</span></code></a> 将包含所有已命名的标志和值中所有已命名的标志组合:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span> <span class="nc">Color</span><span class="p">(</span><span class="n">Flag</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="n">RED</span> <span class="o">=</span> <span class="n">auto</span><span class="p">()</span>
|
||
<span class="gp">... </span> <span class="n">GREEN</span> <span class="o">=</span> <span class="n">auto</span><span class="p">()</span>
|
||
<span class="gp">... </span> <span class="n">BLUE</span> <span class="o">=</span> <span class="n">auto</span><span class="p">()</span>
|
||
<span class="gp">... </span> <span class="n">MAGENTA</span> <span class="o">=</span> <span class="n">RED</span> <span class="o">|</span> <span class="n">BLUE</span>
|
||
<span class="gp">... </span> <span class="n">YELLOW</span> <span class="o">=</span> <span class="n">RED</span> <span class="o">|</span> <span class="n">GREEN</span>
|
||
<span class="gp">... </span> <span class="n">CYAN</span> <span class="o">=</span> <span class="n">GREEN</span> <span class="o">|</span> <span class="n">BLUE</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="n">Color</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> <span class="c1"># named combination</span>
|
||
<span class="go"><Color.YELLOW: 3></span>
|
||
<span class="gp">>>> </span><span class="n">Color</span><span class="p">(</span><span class="mi">7</span><span class="p">)</span> <span class="c1"># not named combination</span>
|
||
<span class="go"><Color.CYAN|MAGENTA|BLUE|YELLOW|GREEN|RED: 7></span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
</section>
|
||
</section>
|
||
</section>
|
||
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
||
<div class="sphinxsidebarwrapper">
|
||
<h3><a href="../contents.html">目录</a></h3>
|
||
<ul>
|
||
<li><a class="reference internal" href="#"><code class="xref py py-mod docutils literal notranslate"><span class="pre">enum</span></code> --- 对枚举的支持</a><ul>
|
||
<li><a class="reference internal" href="#module-contents">模块内容</a></li>
|
||
<li><a class="reference internal" href="#creating-an-enum">创建 Enum</a></li>
|
||
<li><a class="reference internal" href="#programmatic-access-to-enumeration-members-and-their-attributes">枚举成员及其属性的编程访问</a></li>
|
||
<li><a class="reference internal" href="#duplicating-enum-members-and-values">重复的枚举成员和值</a></li>
|
||
<li><a class="reference internal" href="#ensuring-unique-enumeration-values">确保枚举值唯一</a></li>
|
||
<li><a class="reference internal" href="#using-automatic-values">使用自动设定的值</a></li>
|
||
<li><a class="reference internal" href="#iteration">迭代</a></li>
|
||
<li><a class="reference internal" href="#comparisons">比较运算</a></li>
|
||
<li><a class="reference internal" href="#allowed-members-and-attributes-of-enumerations">合法的枚举成员和属性</a></li>
|
||
<li><a class="reference internal" href="#restricted-enum-subclassing">受限的 Enum 子类化</a></li>
|
||
<li><a class="reference internal" href="#pickling">打包(pickle)</a></li>
|
||
<li><a class="reference internal" href="#functional-api">函数式 API</a></li>
|
||
<li><a class="reference internal" href="#derived-enumerations">派生的枚举</a><ul>
|
||
<li><a class="reference internal" href="#intenum">IntEnum</a></li>
|
||
<li><a class="reference internal" href="#intflag">IntFlag</a></li>
|
||
<li><a class="reference internal" href="#flag">标志位</a></li>
|
||
<li><a class="reference internal" href="#others">其他事项</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a class="reference internal" href="#when-to-use-new-vs-init">何时使用 <code class="xref py py-meth docutils literal notranslate"><span class="pre">__new__()</span></code> 与 <code class="xref py py-meth docutils literal notranslate"><span class="pre">__init__()</span></code></a></li>
|
||
<li><a class="reference internal" href="#interesting-examples">有趣的示例</a><ul>
|
||
<li><a class="reference internal" href="#omitting-values">省略值</a><ul>
|
||
<li><a class="reference internal" href="#using-auto">使用 <code class="xref py py-class docutils literal notranslate"><span class="pre">auto</span></code></a></li>
|
||
<li><a class="reference internal" href="#using-object">使用 <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></a></li>
|
||
<li><a class="reference internal" href="#using-a-descriptive-string">使用描述性字符串</a></li>
|
||
<li><a class="reference internal" href="#using-a-custom-new">使用自定义的 <code class="xref py py-meth docutils literal notranslate"><span class="pre">__new__()</span></code></a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a class="reference internal" href="#orderedenum">OrderedEnum</a></li>
|
||
<li><a class="reference internal" href="#duplicatefreeenum">DuplicateFreeEnum</a></li>
|
||
<li><a class="reference internal" href="#planet">Planet</a></li>
|
||
<li><a class="reference internal" href="#timeperiod">TimePeriod</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a class="reference internal" href="#how-are-enums-different">各种枚举有何区别?</a><ul>
|
||
<li><a class="reference internal" href="#enum-classes">枚举类</a></li>
|
||
<li><a class="reference internal" href="#enum-members-aka-instances">枚举成员(即实例)</a></li>
|
||
<li><a class="reference internal" href="#finer-points">细节要点</a><ul>
|
||
<li><a class="reference internal" href="#supported-dunder-names">支持的 <code class="docutils literal notranslate"><span class="pre">__dunder__</span></code> 名称</a></li>
|
||
<li><a class="reference internal" href="#supported-sunder-names">支持的 <code class="docutils literal notranslate"><span class="pre">_sunder_</span></code> 名称</a></li>
|
||
<li><a class="reference internal" href="#enum-member-type"><code class="docutils literal notranslate"><span class="pre">Enum</span></code> 成员类型</a></li>
|
||
<li><a class="reference internal" href="#boolean-value-of-enum-classes-and-members"><code class="docutils literal notranslate"><span class="pre">Enum</span></code> 类和成员的布尔值</a></li>
|
||
<li><a class="reference internal" href="#enum-classes-with-methods">带有方法的 <code class="docutils literal notranslate"><span class="pre">Enum</span></code> 类</a></li>
|
||
<li><a class="reference internal" href="#combining-members-of-flag">组合 <code class="docutils literal notranslate"><span class="pre">Flag</span></code> 的成员</a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
|
||
<h4>上一个主题</h4>
|
||
<p class="topless"><a href="reprlib.html"
|
||
title="上一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">reprlib</span></code> --- 另一种 <code class="xref py py-func docutils literal notranslate"><span class="pre">repr()</span></code> 实现</a></p>
|
||
<h4>下一个主题</h4>
|
||
<p class="topless"><a href="numeric.html"
|
||
title="下一章">数字和数学模块</a></p>
|
||
<div role="note" aria-label="source link">
|
||
<h3>本页</h3>
|
||
<ul class="this-page-menu">
|
||
<li><a href="../bugs.html">报告 Bug</a></li>
|
||
<li>
|
||
<a href="https://github.com/python/cpython/blob/3.8/Doc/library/enum.rst"
|
||
rel="nofollow">显示源代码
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="clearer"></div>
|
||
</div>
|
||
<div class="related" role="navigation" aria-label="related navigation">
|
||
<h3>导航</h3>
|
||
<ul>
|
||
<li class="right" style="margin-right: 10px">
|
||
<a href="../genindex.html" title="总目录"
|
||
>索引</a></li>
|
||
<li class="right" >
|
||
<a href="../py-modindex.html" title="Python 模块索引"
|
||
>模块</a> |</li>
|
||
<li class="right" >
|
||
<a href="numeric.html" title="数字和数学模块"
|
||
>下一页</a> |</li>
|
||
<li class="right" >
|
||
<a href="reprlib.html" title="reprlib --- 另一种 repr() 实现"
|
||
>上一页</a> |</li>
|
||
|
||
<li><img src="../_static/py.svg" alt="python logo" style="vertical-align: middle; margin-top: -1px"/></li>
|
||
<li><a href="https://www.python.org/">Python</a> »</li>
|
||
<li class="switchers">
|
||
<div class="language_switcher_placeholder"></div>
|
||
<div class="version_switcher_placeholder"></div>
|
||
</li>
|
||
<li>
|
||
|
||
</li>
|
||
<li id="cpython-language-and-version">
|
||
<a href="../index.html">3.8.20 Documentation</a> »
|
||
</li>
|
||
|
||
<li class="nav-item nav-item-1"><a href="index.html" >Python 标准库</a> »</li>
|
||
<li class="nav-item nav-item-2"><a href="datatypes.html" >数据类型</a> »</li>
|
||
<li class="right">
|
||
|
||
|
||
<div class="inline-search" role="search">
|
||
<form class="inline-search" action="../search.html" method="get">
|
||
<input placeholder="快速搜索" aria-label="快速搜索" type="text" name="q" />
|
||
<input type="submit" value="转向" />
|
||
<input type="hidden" name="check_keywords" value="yes" />
|
||
<input type="hidden" name="area" value="default" />
|
||
</form>
|
||
</div>
|
||
|
|
||
</li>
|
||
|
||
</ul>
|
||
</div>
|
||
<div class="footer">
|
||
© <a href="../copyright.html">版权所有</a> 2001-2024, Python Software Foundation.
|
||
<br />
|
||
This page is licensed under the Python Software Foundation License Version 2.
|
||
<br />
|
||
Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.
|
||
<br />
|
||
|
||
<br />
|
||
|
||
The Python Software Foundation is a non-profit corporation.
|
||
<a href="https://www.python.org/psf/donations/">Please donate.</a>
|
||
<br />
|
||
<br />
|
||
|
||
最后更新于 12月 09, 2024.
|
||
<a href="https://docs.python.org/3/bugs.html">Found a bug</a>?
|
||
<br />
|
||
|
||
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 2.4.4.
|
||
</div>
|
||
|
||
</body>
|
||
</html> |