擅长:python、mysql、java
<p><em>有一个更好的答案,但我还是把它贴出来,因为它可能有助于理解这个问题。</em></p>
<p>文件给出了以下提示:</p>
<blockquote>
<p>EnumMeta creates them all while it is creating the Enum class itself,
and then puts a custom <strong>new</strong>() in place to ensure that no new ones
are ever instantiated by returning only the existing member instances.</p>
</blockquote>
<p>所以我们必须等待重新定义<code>__new__</code>,直到类被创建。通过一些难看的修补,这通过了测试:</p>
<pre><code>from enum import Enum
from datetime import date
class WeekDay(Enum):
MONDAY = 0
TUESDAY = 1
WEDNESDAY = 2
THURSDAY = 3
FRIDAY = 4
SATURDAY = 5
SUNDAY = 6
wnew = WeekDay.__new__
def _new(cls, value):
if isinstance(value, date):
return wnew(cls, value.weekday()) # not date.weekday()
else:
return wnew(cls, value)
WeekDay.__new__ = _new
assert WeekDay(0) == WeekDay.MONDAY
assert WeekDay(date(2019, 3, 4)) == WeekDay.MONDAY # not 2019,4,3
</code></pre>