python3类比较:对象等于和小于其他

时间:2018-08-14 17:22:11

标签: python python-3.x comparison

Python3将类实现比较器的方式从单个__cmp__函数更改为6 possible functions。我无法将自己的脑袋缠绕在由此产生的几个怪异怪癖上。

例如,参加此类:

from functools import total_ordering

class Class:
  def __init__(self, a, b, c):
    self.a = a
    self.b = b
    self.c = c

  def __eq__(self, other):
    return self.a == other.a and self.b == other.b

  @total_ordering
  def __lt__(self, other):
    return self.c < other.c

这样,您可以轻松地获得两个彼此相等的对象,并且其中一个对象小于另一个对象(例如Class(1,2,3)Class(1,2,4))。现在,您可以轻松地认为这只是糟糕的设计。您不应该拥有一个使用不同属性的比较器,这很好。但现在考虑一下这个经过稍微修改的类:

from functools import total_ordering

class Class:
  def __init__(self, date, name, c):
    self.date = date
    self.name = name

  def __eq__(self, other):
    return self.date == other.date and self.name == other.name

  @total_ordering
  def __lt__(self, other):
return self.date < other.date

此类显然是可订购的(按日期)。但是我也可以有两个彼此不相等但都不小于另一个的对象(例如Class(date(2018,8,14), 'Alice')Class(date(2018,8,14), 'Bob'))。

我想这里有几个问题:

  1. 是否存在有关处理这种新型比较的“正确”方法的指南?
  2. sorted()sort()将如何处理比较不正确的情况?假设,例如,我们创建了一个对象,该对象既小于又大于另一个对象(因为我们很愚蠢)?幕后会发生什么?
  3. 此新比较方法的价值是什么?上面的简单链接指出“在Python 2开发的早期,很明显,仅允许三种情况下对象的相对顺序过于局限”,但并未详细说明。在我看来,这种风格的潜在危险远远大于好处。

0 个答案:

没有答案