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 指出的那样,cmp
它在3.x中消失了。有没有其他选择可以像上面那样轻松实现比较__cmp__
?