Python 操作符重载
我需要实现一个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.
不是比较self
的seq
和other
,而是比较self
的seq
和other
的seq
。
这里的other
是另一个DNA。
如果你需要比较长度:
def __lt__(self, other):
return len(self.seq) < len(other.seq)
etc.