检查__eq__中的身份是否有意义?

时间:2010-07-05 13:53:37

标签: python equality

为类实现自定义相等函数时,首先检查身份是否有意义?一个例子:

def __eq__(self, other):
    return (self is other) or (other criteria)

这有趣的是其他标准可能更昂贵的情况(例如比较一些长字符串)。

5 个答案:

答案 0 :(得分:7)

首先检查身份可能是一个非常合理的快捷方式,而在平等方法中,您应该寻找好的快捷方式(平等和非平等),以便您尽快返回。

但是,另一方面,如果您对等式的测试另外便宜并且您在实践中不太可能将对象与自身进行比较,那么它也可能是一个完全多余的检查。

例如,如果可以通过比较一个或两个整数来衡量对象之间的相等性,那么这应该比身份测试更快,因此在比较id s所需的时间之内整个答案。请记住,如果您检查身份并且对象没有相同的id(在大多数情况下很可能),那么您还没有获得任何东西,因为您仍然需要进行全面检查。 / p>

因此,如果完全相等检查不便宜并且可能会将对象与自身进行比较,那么首先检查身份可能是一个好主意。


请注意,默认情况下不进行检查的另一个原因是,具有相同身份的对象比较为非相等,这是非常合理的(尽管很少见),例如:

>>> s = float('nan')
>>> s == s
False

答案 1 :(得分:3)

necesarry:没有

是否有意义:当然,为什么不呢?

默认情况下不会进行此类检查,您可以在此处看到:

class bad(object):
    def __eq__(self, other):
        return False

x = bad()
print x is x, x==x # True, False

答案 2 :(得分:2)

在类中实现自定义相等性时,您可以自行决定是否先检查标识。这完全取决于你。请注意,在Python中,确定__eq____ne__将为给定参数返回相同的值也是完全有效的;因此,可以定义相等性,使得身份不是捷径。

这肯定是速度的提高,尽管有多少取决于方法的复杂性。我通常不会在我的自定义类中烦恼,但我没有很多速度关键代码(我所做的,对象比较不是热点)。

对于我的大多数对象,等式方法如下:

def __eq__(self, o):
    try:
        return self.x == o.x and self.y == o.y
    except AttributeError:
        return False

我可以在方法的开头轻松添加if self is o: return True检查。

如果您覆盖__hash__,请务必覆盖__eq__,否则您会在setdict中感到奇怪的行为。

答案 3 :(得分:1)

几年前我在comp.lang.python上问了一个类似的问题 - here is the thread。当时的结论是,如果你对自己的对象进行了很多测试,或者你的其他相等测试逻辑很慢,那么前期身份测试是值得的。

答案 4 :(得分:0)

这只是出于性能原因。

在我工作的一个编程工作中,在Java中,这总是完成的,尽管它不会改变任何功能。