首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用dunder方法进行对象比较

如何使用dunder方法进行对象比较
EN

Stack Overflow用户
提问于 2021-07-01 09:45:31
回答 2查看 1.1K关注 0票数 3

使用dunder方法对两个对象进行比较

我试图比较两个“时间对象”,但我得到了以下错误:

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

这就是我试过的:

  1. I第一次初始化'time Class'.

代码语言:javascript
复制
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. I创建了一个方法来比较这两个时间对象。

代码语言:javascript
复制
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. I创建了dunder .

代码语言:javascript
复制
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. I实例化了一些对象,并尝试比较它们(导致错误)。

代码语言:javascript
复制
t1 = Time(13, 10, 5)
t2 = Time(5, 15, 30)

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

我一定是遗漏了什么。欢迎所有关于编码的提示!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-01 09:50:11

有许多方法(或魔术-方法),如果您想使用<<=,那么您希望使用__lt__表示<__le__表示<= (表示小于和小于等于)。

代码语言:javascript
复制
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。

票数 1
EN

Stack Overflow用户

发布于 2021-07-01 10:03:43

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

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68207928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档