【问题标题】:Override all Python comparison methods in one declaration在一个声明中覆盖所有 Python 比较方法
【发布时间】:2020-11-30 09:45:06
【问题描述】:

假设你有一个简单的类,比如下面的A。除了比较本身之外,比较方法几乎都是相同的。是否有一种捷径可以在一个方法中声明六种方法以支持所有比较,例如B

我问主要是因为B 对我来说似乎更 Pythonic,我很惊讶我的搜索没有找到这样的路线。

class A:
    def __init__(self, number: float, metadata: str):
        self.number = number
        self.metadata = metadata

    def __lt__(self, other):
        return self.number < other.number

    def __le__(self, other):
        return self.number <= other.number

    def __gt__(self, other):
        return self.number > other.number

    def __ge__(self, other):
        return self.number >= other.number

    def __eq__(self, other):
        return self.number == other.number

    def __ne__(self, other):
        return self.number != other.number


class B:
    def __init__(self, number: float, metadata: str):
        self.number = number
        self.metadata = metadata

    def __compare__(self, other, comparison):
        return self.number.__compare__(other.number, comparison)

【问题讨论】:

    标签: python


    【解决方案1】:

    functools 模块提供了total_ordering 装饰器,该装饰器旨在提供所有比较方法,前提是您至少提供了__lt__()__le__()__gt__()__ge__() 中的一种。

    请参阅Martijn Pieters 的回复。

    【讨论】:

    • 不正确。例如,如果您只提供__lt__,那么A(0, '') &lt;= A(0, '') 仍然返回False
    【解决方案2】:

    为了更简单,python 标准库附带了一个名为 operator 的模块。

    它有operator.__eq__operator.__ge__等方法。因此,如果您想比较,您可以轻松地将它们称为方法并进行比较。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-07
      • 2010-11-13
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多