假设我定义了一个类A
,我不希望任何人在不离开的情况下写出该类的不等式。
class A():
def __ne__(self, other):
return NotImplemented
print(A() != A())
但这打印出True
并且没有提出TypeError
虽然我故意“关闭”!=
运营商?
答案 0 :(得分:8)
如果NotImplemented
返回__ne__
或True
,则表示您知道时,表示您
通常,Python会交换操作数;如果False
导致a != b
,则会尝试NotImplemented
。这也会失败,因为你在运营商的两边使用相同的类型。对于b != a
运算符,Python将回退到比较它们的内存地址,这些不一样(两个单独的实例),因此返回False。
请参阅do_richcompare
C function for details。
如果这是您的预期结果,则必须手动提升!=
。
答案 1 :(得分:-2)
它给你True,因为你返回例外,而不是提升它。这意味着您将返回一个非Null对象(异常)作为测试结果。除非另有说明,否则将非Null对象评估为True。 请记住,异常是一个普通的对象,直到你提出它为止。
所以你应该有一个这样的方法:
class A():
def __ne__(self, other):
raise NotImplementedError