首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python魔术方法混淆

Python魔术方法混淆
EN

Stack Overflow用户
提问于 2013-11-01 16:30:22
回答 2查看 1.4K关注 0票数 6

我遇到了一些神奇的比较方法令人困惑的行为。假设我们有以下类:

代码语言:javascript
复制
class MutNum(object):
    def __init__ (self, val):
        self.val = val

    def setVal(self, newval):
        self.val = newval

    def __str__(self):
        return str(self.val)

    def __repr__(self):
        return str(self.val)

    # methods for comparison with a regular int or float:
    def __eq__(self, other):
        return self.val == other

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

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

    def __ge__(self, other):
        return self.__gt__(other) or self.__eq__(other)

    def __le__(self, other):
        return self.__lt__(other) or self.__eq__(other)

类执行它应该做的事情,将MutNum对象与常规int或float进行比较是没有问题的。然而,这正是我所不理解的,当给出两个MutNum对象时,它甚至可以比较好。

代码语言:javascript
复制
a = MutNum(42)
b = MutNum(3)
print(a > b) # True
print(a >= b) # True
print(a < b) # False
print(a <= b) # False
print(a == b) # False

为什么要这么做?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-01 16:56:47

它的计算结果如下(使用repr-like表示法而不是引用变量):

代码语言:javascript
复制
   MutNum(42) > MutNum(3)
=> MutNum(42).__gt__(MutNum(3))
=> MutNum(42).val > MutNum(3)
=> 42 > MutNum(3)

从那里开始,这就是你已经知道的int比较。

票数 5
EN

Stack Overflow用户

发布于 2013-11-01 17:26:50

如果你加入了一些印刷品和/或sys.stderr.Writs,我想你会看到发生了什么。例:

代码语言:javascript
复制
def __gt__(self, other):
    sys.stderr.write('__gt__\n')
    sys.stderr.write('{}\n'.format(type(other)))
    sys.stderr.write('{} {}\n'.format(self.val, other))
    result = self.val > other
    sys.stderr.write('result {}\n'.format(result))
    return result

def __lt__(self, other):
    sys.stderr.write('__lt__\n')
    sys.stderr.write('{}\n'.format(type(other)))
    sys.stderr.write('{} {}\n'.format(self.val, other))
    result = self.val < other
    sys.stderr.write('result {}\n'.format(result))
    return result

当您尝试比较self.val (一个int)和其他一个(一个MutNum)时,python意识到它没有什么可以将int与MutNum进行比较,并颠倒比较的顺序,并将MutNum与int进行比较--这是您定义的东西。也就是说,一个单独的>比较正在按您的预期执行>,但它也执行一个<。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19731048

复制
相关文章

相似问题

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