假设我定义了一个类A
,并且我不希望任何人写出该类的不等式而不逃脱。
class A():
def __ne__(self, other):
return NotImplemented
print(A() != A())
但是尽管我故意“关闭”了操作员,但这打印出来True
并没有引发?TypeError
!=
假设我定义了一个类A
,并且我不希望任何人写出该类的不等式而不逃脱。
class A():
def __ne__(self, other):
return NotImplemented
print(A() != A())
但是尽管我故意“关闭”了操作员,但这打印出来True
并没有引发?TypeError
!=
当您返回时NotImplemented
,您表示您不知道是否__ne__
应该返回True
或False
。
通常,Python 会交换操作数;如果a != b
结果为NotImplemented
,它会b != a
改为尝试。这也会失败,因为您在运算符的两侧使用相同的类型。对于!=
操作符,Python 将回退到比较它们的内存地址,并且这些地址不相同(两个单独的实例),因此返回 False。
有关详细信息,请参阅do_richcompare
C 函数。
TypeError()
如果这是您的预期结果,您将不得不手动加注。
它给你 True 因为你正在返回一个异常,而不是引发它。这意味着您将返回一个非 Null 对象(异常)作为测试的结果。除非另有说明,否则非 Null 对象将被评估为 True。请记住,异常是一个普通对象,直到您引发它。
所以你应该有一个看起来像这样的方法:
class A():
def __ne__(self, other):
raise NotImplementedError