首页 > 解决方案 > 在 Python 中将值与 __eq__ 进行比较

问题描述

早安/晚安,我是 Python 新手,我正在创建一个名为Alpharangerange 函数的类,但只有大写字母。在我测试该课程是否有效时,我偶然发现了一个奇怪的错误。当我设置它们时letters1 = Alpharange('D')letters2 = Alpharange('A', 'D')它们打印出它们应该打印的相同值,但 Python 说它们彼此不相等。为了解决这个问题,我使用该____eq____方法返回了 true,虽然修复了错误,但如果我使用其他测试运行它,即使它们彼此不相等letters3 = Alpharange('E'),它也会返回 true。letters4 = Alpharange('B', 'E')

这是我的班级。是否有更好的使用方法或以other与我相同的方式使用参数的方法self

class AlphabetRange:
    
    def __init__(self, *args):
        self.for_loop = tuple(args)
        if len(self.for_loop) == 1:
            self.start_point = ord('A')
            self.end_point = ord(self.for_loop[0])
        elif len(self.for_loop) == 2:
            self.start_point = ord(self.for_loop[0])
            self.end_point = ord(self.for_loop[1])
        elif len(self.for_loop) == 3:
            self.start_point = ord(self.for_loop[0])
            self.end_point = ord(self.for_loop[1])


    #Use __iter__ to make obj iterable    
    def __iter__(self):
        if len(self.for_loop) == 1:
            self.start_point = ord('A')
            return self
        elif len(self.for_loop) == 2:
            self.start_point = ord(str(self.for_loop[0]))
            return self
        elif len(self.for_loop) == 3:
            self.start_point = ord(self.for_loop[0])
            return self

    def __next__(self):
        #the_end = self.end_point
        if self.start_point < self.end_point:
            if len(self.for_loop) == 1:
                lets = chr(self.start_point)
                self.start_point += 1
                return lets
            elif len(self.for_loop) == 2:
                lets = chr(self.start_point)
                self.start_point += 1
                return lets
            elif len(self.for_loop) == 3:
                lets = chr(self.start_point)
                self.start_point += self.for_loop[2]
                return lets
        else:
            raise StopIteration

    def __eq__(self, other):
        return True

标签: pythonmagic-methods

解决方案


通过__eq__这样实现,您基本上是在告诉 python,无论什么other都无所谓,您的对象等于它。相反,您要做的是在其中实现实际逻辑:

def __eq__(self, other):
    return self.start_point == other.start_point and self.end_point == other.end_point

旁注:我的代码是为了说明可以使用的某种类型的逻辑。请仔细检查如何区分相似的对象并使用它来确定__eq__应该如何工作。


推荐阅读