<p>现在Kemp和Daweo已经指出魔法是通过<code>__format__</code>发生的,我能够深入挖掘,事实上在<code>Enum</code>类中我们发现:</p>
<pre><code>def __format__(self, format_spec):
# mixed-in Enums should use the mixed-in type's __format__, otherwise
# we can get strange results with the Enum name showing up instead of
# the value
# pure Enum branch
if self._member_type_ is object:
cls = str
val = str(self)
# mix-in branch
else:
cls = self._member_type_
val = self._value_
return cls.__format__(val, format_spec)
</code></pre>
<p><code>ResourceType</code>也是一个混合的inEnum,这是由于<code>namedtuple</code>的继承性,因此对于<code>__format__</code>情况,调用被重定向到“ResourceType”<code>namedtuple</code>,只使用enum实例的值,该值通过约定/实现存储在<code>_value_</code>中</p>
<p>在我的例子中,我希望<code>ResourceType</code>枚举在外部尽可能像一个枚举一样出现,尽管它也是一个namedtuple,因此我现在将其更改为:</p>
<pre><code>class ResourceType(namedtuple('ResourceType', 'value ext required'), Enum):
RGB = auto(), '.png', True
def __format__(self, format_spec):
return str.__format__(str(self), format_spec)
</code></pre>
<p>这完全等同于在<code>Enum.__format__</code>实现中强制执行“纯枚举分支”</p>