擅长:python、mysql、java
<p>问题是,比较调用的是与您所寻找的相反的<code>__eq__</code>函数。当您有一个<code>ScheduleData() == datetime.date()</code>但<code>in</code>运算符以相反的顺序执行比较,<code>datetime.date() == ScheduleData()</code>而不是调用您定义的<code>__eq__</code>,定义的<code>__eq__</code>就可以工作了。只有充当<em>左侧</em>的类才会调用其<code>__eq__</code>。在</p>
<p>这个问题出现在python2而不是3中的原因与std库中<code>datetime.date.__eq__</code>的定义有关。以以下两类为例:</p>
<pre><code>class A(object):
def __eq__(self, other):
print ('A.__eq__')
return False
class B(object):
def __eq__(self, other):
print ('B.__eq__')
items = [A()]
B() in items
</code></pre>
<p>运行此代码将在Python2和Python3下打印<code>B.__eq__</code>。<code>B</code>对象用作lhs,就像您的<code>datetime.date</code>对象在python2中使用一样。但是,如果我重新定义<code>B.__eq__</code>以类似于python3对<code>datetime.date.__eq__</code>的定义:</p>
^{pr2}$
<p>然后:</p>
<pre><code>First B.__eq__
A.__eq__
</code></pre>
<p>在Python 2和Python 3下打印。返回<code>NotImplemented</code>会导致参数颠倒的检查。在</p>
<p>在你的类中使用<code>timetuple</code>可以解决这个问题,正如@TimPeters所说(有趣的怪癖我不知道),尽管它似乎不需要是一个函数</p>
<pre><code>class ScheduleData:
timetuple = None
</code></pre>
<p>是你所需要的,除了你已经拥有的。在</p>