2

使用 dunder 方法比较两个对象

我试图比较两个“时间对象”,但出现此错误:

'TypeError: '<' not supported between instances of 'Time' and 'Time'

这是我尝试过的:

  1. 我首先初始化了“时间类”。
class Time:
    def __init__(self, h, m, s):
        self._h = h
        self._m = m
        self._s = s

    # Read-only field accessors
    @property
    def hours(self):
        return self._h

    @property
    def minutes(self):
        return self._m

    @property
    def seconds(self):
        return self._s
  1. 我创建了一个方法来比较两个 Time 对象。
def _cmp(time1, time2):
    if time1._h < time2._h:
        return 1
    if time1._h > time2._h:
        return -1
    if time1._m < time2._m:
        return 1
    if time1._m > time2._m:
        return -1
    if time1._s < time2._s:
        return 1
    if time1._s > time2._s:
        return -1
    else:
        return 0
  1. 我创建了 dunder 方法。
def __eq__(self, other):
    return True if _cmp(self, other) == 0 else False

def __lt__(self, other):
    return True if _cmp(self, other) == 1 else False

def __le__(self, other):
    return True if _cmp(self, other) == 1 or _cmp(self, other) == 0 else False
  1. 我实例化了一些对象,并尝试比较它们(导致错误)。
t1 = Time(13, 10, 5)
t2 = Time(5, 15, 30)

print(t1 < t2)
print(t2 <= t1)

我肯定错过了什么。欢迎所有关于编码的提示!

4

2 回答 2

0

有很多dunder-methods(或magic-methods),如果你想使用<然后<=你想使用 __lt__for<__le__for <=(代表小于和小于等于)

class A:
    def __init__(self, n):
        self.n = n

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

a = A(5)
b = A(10)
print(a <= b)

将返回 True,因为 5 小于或等于 10。

于 2021-07-01T09:50:11.793 回答
0

正如 Matthias 和 Jonathan 建议的那样,我忘记缩进以下代码并将其放在我的 Time 类之外:

def __eq__(self, other):
    return True if _cmp(self, other) == 0 else False

def __lt__(self, other):
    return True if _cmp(self, other) == 1 else False

def __le__(self, other):
    return True if _cmp(self, other) == 1 or _cmp(self, other) == 0 else False
于 2021-07-01T10:03:43.203 回答