Python 2.x 有两种方法来重载比较运算符,__cmp__
或“富比较运算符”,如 __lt__
.据说富比较重载是首选的,但是为什么会这样呢?
富比较运算符实现起来更简单,但必须使用几乎相同的逻辑实现其中几个运算符。然而,如果您可以使用内置的 cmp
和 tuple 排序,那么 __cmp__
就会变得非常简单,并完成所有的比较:
class A(object):
def __init__(self, name, age, other):
self.name = name
self.age = age
self.other = other
def __cmp__(self, other):
assert isinstance(other, A) # assumption for this example
return cmp((self.name, self.age, self.other),
(other.name, other.age, other.other))
这种简单性似乎比重载所有6(!)更能满足我的需求丰富的比较。(然而,如果你依赖于“交换论点”/反映的行为,你可以把它降到“仅仅”4,但是在我看来,这会导致复杂性的净增加。)
是否有任何不可预见的陷阱,我需要知道,如果我只超载 __cmp__
?
我知道 <
、 <=
、 ==
等操作符可以为其他目的重载,并且可以返回它们喜欢的任何对象。我不是在询问这种方法的优点,而只是在使用这些运算符进行与数字相同意义上的比较时的差异。
更新: 由于 Christopher 指出,cmp
将在3. x 中消失。是否有任何替代方法可以像上面的 __cmp__
那样简单地进行比较?