Python 操作符重载

8 投票
2 回答
24488 浏览
提问于 2025-04-17 19:24

我需要实现一个DNA类,这个类里有一个属性是一个字符串,里面的字符只能是字母表中的'A'、'C'、'G'和'T'。我还需要重载一些运算符,比如小于、大于等等。

这是我的代码:

class DNA:
    def __init__(self, sequence):
        self.seq = sequence

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

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

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

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

    def __eq__(self, other):
        return (len(self.seq) == len(other))

    def __ne__(self, other):
        return not(self.__eq__(self, other))

dna_1=DNA('ACCGT')
dna_2=DNA('AGT')
print(dna_1 > dna_2)

问题:

当我执行 print(dna_1>dna_2) 时,它返回的是 False,而不是 True... 这是为什么呢?

2 个回答

0

当你用小于号比较的时候,__lt__(other) 方法会被调用,这个方法是针对一个DNA对象的。

当你调用 __init__ 方法时,self.seq 被设置为一个字符串(str)。所以,你实际上是在比较一个字符串和一个DNA对象。

魔法方法确实很神奇,但它们并不是全知全能的。它们不知道你想要的比较是什么,所以会使用默认的方式来处理(可能是 repr() 的输出,我没有检查过)。

你需要明确设计什么样的DNA是相等的。你的代码暗示序列的长度决定了相等性。因此,不同的序列可能会被计算为相等。你的相等方法因此暗示一个序列比另一个短时就是小于。所以,或许你可以通过比较序列的长度来改写这个方法,而不是直接比较字符串和DNA对象。

19

你可能想要比较一下seq

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

etc.

不是比较selfseqother,而是比较selfseqotherseq

这里的other是另一个DNA。

如果你需要比较长度:

def __lt__(self, other):
    return len(self.seq) < len(other.seq)

etc.

撰写回答