<p>问题是在<code>Bar</code>存在之前调用了<code>Bar.VALUE.__init__</code>。在</p>
<p>您可以在<a href="https://bitbucket.org/stoneleaf/enum34/src/f24487b45cd041fc9406d67441d2186ac70772b7/enum/__init__.py?at=default&fileviewer=file-view-default#__init__.py-235" rel="nofollow noreferrer">^{<cd3>}</a>中看到这种情况,但即使不查看代码,它也几乎可以通过</em>来工作:<code>Enum</code>类的全部要点是,它的枚举成员是常量值,充当类的属性,同时也是它的实例。在</p>
<p>在这种情况下,这段代码将在3.4+中使用stdlib <code>enum</code>模块产生完全相同的错误,并在多个第三方<code>enum</code>替换中产生类似的错误。在</p>
<p>一般来说,如果你有枚举层次结构,你应该只把值放在“叶”类中,而行为只放在非叶类中。然而,在<a href="https://docs.python.org/3/library/enum.html#restricted-subclassing-of-enumerations" rel="nofollow noreferrer">Restricted subclassing of enumerations</a>中明确记录的唯一限制是非叶类中没有值,因此从技术上讲,您尝试的操作应该是合法的,即使这是不寻常的,并且从未明确打算起作用。在</p>
<hr/>
<p>如果您使用的是python3,有一个非常简单的解决方法:只需使用<code>super()</code>而不是{<cd8>},这并不重要,因为{<cd2>}还不存在。在</p>
<p>在Python2中,由于这是不可行的,您需要手动模拟<code>super</code>。对于一般性而言,这意味着编写代码来遍历<code>mro</code>等等,但是由于包含两个或多个<code>Enum</code>类的多重继承无论如何都不起作用,所以只需对其进行静态硬编码就可以了:</p>
<pre><code>def __init__(self, value):
Foo.__init__(self)
</code></pre>
<hr/>
<p>或者,如果将设计更改为将所有行为都放在非叶类中,也可以这样做:</p>
^{pr2}$
<hr/>
<p>最有可能的是,无论你实际想要完成什么,都可以用一种更好的方式来完成,而不需要这些改变。但既然你的玩具例子不能完成任何事情,就没有什么可以展示的了。在</p>