假设我定义了一个类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_richcompareC 函数。
TypeError()如果这是您的预期结果,您将不得不手动加注。
它给你 True 因为你正在返回一个异常,而不是引发它。这意味着您将返回一个非 Null 对象(异常)作为测试的结果。除非另有说明,否则非 Null 对象将被评估为 True。请记住,异常是一个普通对象,直到您引发它。
所以你应该有一个看起来像这样的方法:
class A():
def __ne__(self, other):
raise NotImplementedError