<p>必须重载<code>_missing_</code>钩子。<code>WeekDay</code>的所有实例都是在首次定义类时创建的;<code>WeekDay(date(...))</code>是索引操作,而不是创建操作,<code>__new__</code>最初查找绑定到整数0到6的预先存在的值。否则,它将调用<code>_missing_</code>,在这种情况下,您可以将<code>date</code>对象转换为这样一个整数。在</p>
<pre><code>class WeekDay(Enum):
MONDAY = 0
TUESDAY = 1
WEDNESDAY = 2
THURSDAY = 3
FRIDAY = 4
SATURDAY = 5
SUNDAY = 6
@classmethod
def _missing_(cls, value):
if isinstance(value, date):
return cls(value.weekday())
return super()._missing_(value)
</code></pre>
<p>几个例子:</p>
^{pr2}$
<p>(注意:<code>_missing_</code>在python3.6之前不可用。)</p>
<hr/>
<p>在3.6之前,您似乎可以重写<code>EnumMeta.__call__</code>进行相同的检查,但我不确定这是否会产生意外的副作用。(关于<code>__call__</code>的推理总是让我头晕目眩。)</p>
<pre><code># Silently convert an instance of datatime.date to a day-of-week
# integer for lookup.
class WeekDayMeta(EnumMeta):
def __call__(cls, value, *args, **kwargs):
if isinstance(value, date):
value = value.weekday())
return super().__call__(value, *args, **kwargs)
class WeekDay(Enum, metaclass=WeekDayMeta):
MONDAY = 0
TUESDAY = 1
WEDNESDAY = 2
THURSDAY = 3
FRIDAY = 4
SATURDAY = 5
SUNDAY = 6
</code></pre>