Python 3中相同的类

2024-05-07 13:50:17 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python 3中,使类具有可比性的标准方法是什么?(例如,按id)


Tags: 方法id标准
3条回答

sort只需要__lt__

^{}(从2.7/3.2开始)是一个decorator,它提供了所有比较运算符,因此您不必自己编写所有比较运算符。

默认情况下,类是散列的,这使用它们的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__

相关问题 更多 >