3

假设我定义了一个类A,并且我不希望任何人写出该类的不等式而不逃脱。

class A():
    def __ne__(self, other):
        return NotImplemented
print(A() != A())

但是尽管我故意“关闭”了操作员,但这打印出来True并没有引发?TypeError!=

4

2 回答 2

8

当您返回时NotImplemented,您表示您不知道是否__ne__应该返回TrueFalse

通常,Python 会交换操作数;如果a != b结果为NotImplemented,它会b != a改为尝试。这也会失败,因为您在运算符的两侧使用相同的类型。对于!=操作符,Python 将回退到比较它们的内存地址,并且这些地址不相同(两个单独的实例),因此返回 False。

有关详细信息,请参阅do_richcompareC 函数

TypeError()如果这是您的预期结果,您将不得不手动加注。

于 2012-11-22T16:08:53.193 回答
-2

它给你 True 因为你正在返回一个异常,而不是引发它。这意味着您将返回一个非 Null 对象(异常)作为测试的结果。除非另有说明,否则非 Null 对象将被评估为 True。请记住,异常是一个普通对象,直到您引发它。

所以你应该有一个看起来像这样的方法:

class A():
    def __ne__(self, other):
        raise NotImplementedError
于 2012-11-22T16:04:56.223 回答