2024-05-07 13:50:17 发布
网友
在Python 3中,使类具有可比性的标准方法是什么?(例如,按id)
sort只需要__lt__。
sort
__lt__
^{}(从2.7/3.2开始)是一个decorator,它提供了所有比较运算符,因此您不必自己编写所有比较运算符。
默认情况下,类是散列的,这使用它们的id();我不确定为什么要按它们的id()排序类,除非您只是希望顺序稳定。
id()
对于一组完整的比较函数,我使用了以下mixin,您可以将其放入模块中,例如mixin.py。
class ComparableMixin(object): def _compare(self, other, method): try: return method(self._cmpkey(), other._cmpkey()) except (AttributeError, TypeError): # _cmpkey not implemented, or return different type, # so I can't compare with "other". return NotImplemented def __lt__(self, other): return self._compare(other, lambda s, o: s < o) def __le__(self, other): return self._compare(other, lambda s, o: s <= o) def __eq__(self, other): return self._compare(other, lambda s, o: s == o) def __ge__(self, other): return self._compare(other, lambda s, o: s >= o) def __gt__(self, other): return self._compare(other, lambda s, o: s > o) def __ne__(self, other): return self._compare(other, lambda s, o: s != o)
要使用上面的mixin,需要实现一个返回可比较对象键的cmpkey()方法,类似于排序时使用的key()函数。实现可能如下所示:
>>> from .mixin import ComparableMixin >>> class Orderable(ComparableMixin): ... ... def __init__(self, firstname, lastname): ... self.first = firstname ... self.last = lastname ... ... def _cmpkey(self): ... return (self.last, self.first) ... ... def __repr__(self): ... return "%s %s" % (self.first, self.last) ... >>> sorted([Orderable('Donald', 'Duck'), ... Orderable('Paul', 'Anka')]) [Paul Anka, Donald Duck]
我使用这个而不是总的排序方法的原因是this bug。它在Python3.4中是固定的,但通常也需要支持旧的Python版本。
不确定这是否完成,但您需要定义:
__eq__, __gt__, __ge__, __lt__, __le__
正如agf所说,我失踪了:
__ne__
sort
只需要__lt__
。^{} (从2.7/3.2开始)是一个decorator,它提供了所有比较运算符,因此您不必自己编写所有比较运算符。
默认情况下,类是散列的,这使用它们的
id()
;我不确定为什么要按它们的id()
排序类,除非您只是希望顺序稳定。对于一组完整的比较函数,我使用了以下mixin,您可以将其放入模块中,例如mixin.py。
要使用上面的mixin,需要实现一个返回可比较对象键的cmpkey()方法,类似于排序时使用的key()函数。实现可能如下所示:
我使用这个而不是总的排序方法的原因是this bug。它在Python3.4中是固定的,但通常也需要支持旧的Python版本。
不确定这是否完成,但您需要定义:
正如agf所说,我失踪了:
相关问题 更多 >
编程相关推荐