【发布时间】:2010-11-06 20:55:51
【问题描述】:
Python 2.x 有两种重载比较运算符的方法,__cmp__ 或“丰富的比较运算符”,例如 __lt__。 富比较重载据说是首选,但为什么会这样呢?
丰富的比较运算符实现起来更简单,但您必须使用几乎相同的逻辑来实现其中的几个。但是,如果您可以使用内置的 cmp 和元组排序,那么 __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 pointed out,cmp 在 3.x 中消失。 是否有任何替代方案可以像上述__cmp__ 那样轻松实现比较?
【问题讨论】:
-
查看我对你最后一个问题的回答,但实际上有一种设计可以让包括你在内的许多类变得更容易(现在你需要一个 mixin、元类或类装饰器来应用它):如果存在 key 特殊方法,则它必须返回一个值元组,并且所有比较器 AND hash 都是根据该元组定义的。当我向他解释时,Guido 喜欢我的想法,但后来我忙于其他事情,从来没有时间写 PEP……也许是 3.2;-)。与此同时,我一直在使用我的 mixin!-)
标签: python operator-overloading