<p>可以向<code>Enum</code>对象添加属性,也可以使用<code>dict</code>映射<code>Enum</code>。还有其他选择,但这些似乎最简单</p>
<p>假设您有<code>Tree</code>、<code>Rock</code>、<code>Flower</code>等类,对应于<code>Enum</code>的值:</p>
<pre><code>class Tree:
def __init__(self, height, coords):
pass
class Rock:
def __init__(self, coords):
pass
class Flower:
def __init__(self, color, iscarnivore, coords):
pass
</code></pre>
<p>我特别展示了一个扩展版本,其中每个类都有一个不同的初始值设定项和一组不同的默认值。如果它们都相同,请使用现有答案</p>
<p>选项1是这样定义枚举:</p>
<pre><code>class Entities(Enum):
TREE = (Tree, 100, (0, 0))
ROCK = (Rock, (0, 0))
FLOWER = (Flower, 'red', True, (0, 0))
def __new__(cls, t, *args):
obj = object.__new__(cls)
obj._value_ = len(cls.__members__) + 1
obj.type = t
obj.defaults = args
return obj
def init(self):
return self.type(*self.defaults)
</code></pre>
<p>现在,<code>my_func</code>只是枚举本身的<code>init</code>方法:</p>
<pre><code>>>> FLOWER.init() # Calls Flower('red', False, (0, 0))
</code></pre>
<p>第二个选项是将<code>Enum</code>成员映射到类:</p>
<pre><code>cmap = {
Entitites.TREE: (Tree, 100, (0, 0)),
Entitites.ROCK: (Rock, (0, 0)),
Entitites.FLOWER: (Flower, 'red', True, (0, 0)),
}
def my_func(entity):
t, *args = cmap[entity]
return t(*args)
</code></pre>