我有这样的Range类的代码:
class Range:
def __init__(self, start, end):
self.setStart(start)
self.setEnd(end)
def getStart(self):
return self.start
def setStart(self, s):
self.start = s
def getEnd(self):
return self.end
def setEnd(self, e):
self.end = e
def getLength(self):
return len(range(self.start, self.end))
def overlaps(self, r):
if (r.getStart() < self.getEnd() and r.getEnd() >= self.getEnd()) or \
(self.getStart() < r.getEnd() and self.getEnd() >= r.getEnd()) or \
(self.getStart() >= r.getStart() and self.getEnd() <= r.getEnd()) or \
(r.getStart() >= self.getStart() and r.getEnd() <= self.getEnd()):
return True
else:
return False
我的任务是创建一个名为DNAFeature的Range子类,它表示一个也有一个strand和一个序列名称的Range:
实施设置和返回链信息的setStrand
和getStrand
,以及setSeqName
和getSeqName
,它们设置或返回要素所属序列的名称。
如果某个要素位于减(反向)链上,getStrand()
应返回-1。如果要素位于正链上,则getStrand()
应返回1.如果未设置strand,则getStrand()
应返回0.
我曾尝试写过一些东西,但对我来说看起来并不合适,大家可以帮我解决这个问题,非常感谢你们,这是我的代码:
class DNAFeature(Range):
def __init__(self, strand, sequence):
self.setStrand(strand)
self.setSeqName(sequence)
def getSeqName(self):
return self.plus or minus
def setSeqName(self, seq):
self.sequence = seq
def getStrand(self):
if self.getSeqName(self.strand) == 'plus':
return 1
if self.getSeqName(self.strand) == 'minus':
return -1
else:
return 0
def setStrand(self, strand):
self.strand = strand
答案 0 :(得分:4)
一般来说,如果您提供特定错误消息或出错的事情,则回答问题要容易得多。以下是我试图运行上述内容时发生的事情:
首先:
`SyntaxError: invalid syntax`
<{1>} if seq == POSITIVE
。这有什么不对?哦,是的,你在条件之后错过了冒号。如果你添加该文件至少解析。所以让我们尝试做一些编码:
# Your code here, then:
feature = DNAFeature()
跑步给出:
TypeError: __init__() takes exactly 3 positional arguments (1 given)
哦,好的,我们需要将一些参数传递给DNAFeature
的初始化器。让我们把它放在+链上,并称之为foo:
feature = DNAFeature(1, "foo")
现在我们得到:
AttributeError: 'DNAFeature' object has no attribute 'setStrand'
那是什么意思?好的,你还没有定义setStrand
。 (注意:你不应该这样做。但稍后会更多。)让我们来定义它:
def setStrand(self, strand):
self.strand = strand
我不想解决代码中的其他问题(提示:你需要在使用之前定义变量),但这是你应该做的事情。
对,不同的东西。 以上是错误的代码。我希望你已经编写了Range
课程并且它没有被提供作为课程的一部分,因为如果你的课程很糟糕 - 当然。主要的问题是使用getter和setter - 我猜你是Java出生和繁殖的?在Python中,您不需要为所有内容编写getter和setter,因为如果需要,您可以随后添加它们。相反,只需使用类属性。请查看Range
的以下代码:
class Range:
def __init__(self, start, end):
self.start = start
self.end = end
def length(self):
return self.end - self.start
def overlaps(self, other):
return not(self.end < other.start or other.end < self.start)
那不是更好吗?没有更讨厌的访问器,overlaps
方法中没有任何比较...如果您在实现代码之前尝试实现的逻辑,它会有所帮助。
看看你现在是否可以写出更好的DNAFeature
。
你仍然没有告诉我getStrand
应该做什么,但是这就是我认为你的目标。假设传递给__init__
的链名称的格式为"+name"
或"-name"
。然后,您可以执行以下操作:
def __init__(self, strand):
sequence = strand[0] #first character of strand
if sequence == "+":
self.strand = 1
self.sequence= strand[1:]
elif sequence == "-":
self.strand = -1
self.sequence = strand[1:]
else:
self.strand = 0
self.sequence = strand
看看你是否能弄清楚它是如何运作的。
答案 1 :(得分:0)
在最通用的情况下(没有做出任何假设),似乎这就是你所需要的:
class DNAFeature(Range):
def __init__(self, start, end):
self.setStart(start)
self.setEnd(end)
self.strand = None
self.sequencename = None
def setStrand(self, s):
self.strand = s
def getStrand(self):
if self.sequenceName == 'plus':
return 1
elif self.sequenceName == 'minus':
return -1
else:
return 0
def setSequenceName(self, s):
self.sequencename = s
def getSequenceName(self, s):
return self.sequenceName
您会注意到,我已重新定义 init 。有一个原因。我记得在你之前的一个问题中,你提到过这是一个Java任务,只是重命名为python。在Java中,构造函数不是继承的(如果我错了,请纠正我)。因此,如果使用相同的评分量规,则不会在此处重新定义构造函数而丢失标记。
希望这有帮助