【问题标题】:Subclass/Child class子类/子类
【发布时间】:2010-10-17 17:22:35
【问题描述】:

我有这个类和子类:

类范围:

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(范围):

   def __init__(self, start, end):
            self.setStart(start)
            self.setEnd(end)
            self.strand = none
            self.sequencename = none
   def getSeqName(self, s):
            return self.SeqName
   def setSeqName(self, s):
            self.sequencename = s
   def getStrand(self):
            if self.SeqName == 'plus':
                    return 1
            elif self.SeqName == 'minus':
                    return -1
            else:
                    return 0
   def setStrand(self, s):
            self.strand = s

这是我必须做的: 创建一个新类 GeneModel,它包含一组代表外显子的 DNAFeature 对象,并且是 DNAFeature 的子类。它应该实现以下方法: getFeats() – 返回一个 DNAFeature 对象列表,按起始位置排序 addFeat(feat)– 接受一个 DNAFeature 专长并将其添加到其内部的 DNAFeature 对象组中 setTranslStart(i)– 接受非负整数,设置起始 ATG 密码子的起始位置 getTranslStart()——返回一个int,起始ATG密码子的起始位置 setTranslStop(i)– 接受正整数,设置终止密码子的结束位置 getTranslStop()——返回一个int,终止密码子的结束位置 setDisplayId(s)——设置基因模型的名称; s 是一个字符串 getDisplayId()——返回基因模型的名称,返回一个字符串,例如,AT1G10555.1 当用户向构造函数和“set”方法传递不正确的类型和值时,GeneModel 应该引发适当的 ValueError 和 TypeError 异常。

我想写什么就写什么,阅读书籍以及寻找将代码组合在一起的方法,但是我对编程很陌生,几乎无法理解如何正确编写代码。老实说,这是我第一次上编程课。因此,如果我在代码中犯了任何有趣的错误,请原谅我。我还没有完成我的代码,还在阅读书籍,看看我的代码在哪里做错和做对了。但是,我真的需要你的帮助来引导我走上正确的道路。非常感谢你们。以下是我的代码:

类基因模型(DNAFeature):

   def __init__(self, translstart, translend, displayid):
            self.setTranslStart(translstart)
            self.setTranslStop(translend)
            setDisplayId(displayid)
   def getFeats():
            result = []
            sort.self.getStart()
            return result
   def addFeat(feat):
            self.addFeat = feat
            return self.getStart+self.getEnd
   def setTranslStart(i):
            self.translstart = self.setStart
            self.translstart = non-negative int
   def getTranslStart():
            return self.translstart
   def setTranslStop(i):
            self.translend = self.setEnd
            self.translend = "+" int
   def getTranslStop():
            return self.translend
   def setDisplayId(s):
            self.displayid = re.compile('r'\AT1G[0-9]{5,5}\.[0-9]{,1}, IGNORECASE')
   def getDisplayId():
            return self.displayid

【问题讨论】:

  • 我对你的模型有点困惑。 GeneModel 是应该包含一组 DNAFeature 实例还是 GeneModel 是 DNAFeature 的子类。这对你如何编写代码有很大的影响。
  • 是的,是的,GeneModel 是 DNAFeature 的子类,我真的很抱歉我的代码,我只是不知道如何正确地做,试图通读书籍...

标签: python bioinformatics


【解决方案1】:

我不明白基因模型的名称是什么。我认为这是特定主题的,但我认为这对你有用:

class GenoModel(DNAFeature):

    def __init__(self, start, end):
        self.setStart(start)
        self.setEnd(end)
        self.strand = None
        self.sequencename = None
        self.exons = []
        self.translStart = None
        self.translStop = None
        self.displayId = None

    def getFeats(self):
        self.exons.sort(cmp=self.start)
        return self.exons

    def addFeat(self, f):

        if type(f) == DNAFeature:
            self.exons.append(f)
        else:
            raise TypeError("Cannot add feature as it is not of type DNAFeature")

    def setTranslStart(self, i):

        if type(i) != int:
            raise TypeError("Cannot set translStart as it is not of type int")
        elif i < 0:
            raise ValueError("Cannot set tanslStart to a negative int")
        else:
            self.translStart = i

    def getTranslStart(self):
        return self.translStart

    def setTranslStop(self, i):

        if type(i) != int:
            raise TypeError("Cannot set translStop as it is not of type int")
        elif i <= 0:
            raise ValueError("Cannot set tanslStop to anything less than 1")
        else:
            self.translStop = i

    def getTranslStop(self):
        return self.translStop

    def setDisplayId(self, s):

        if type(s) != str:
            raise TypeError("Cannot set desiplayId as it is not of type string")
        else:
            self.displayId = s

    def getDisplayId(self):
        return self.displayId

希望这会有所帮助。

【讨论】:

  • 是不是因为 GeneModel 是 DNAFeature 的子类,它是 Range 的子类,所以在 def init 中它必须是我们在 Range 中定义的 3 个参数,即自我,开始和结束?那正确吗?我只是好奇,谢谢检查员
  • 是的,但更重要的是,如果你没有在这里定义一个 init,GeneModel 默认会采用 DNAFeature 的 init。
  • 我明白了,还有一位问题检查员,使用 != 表示什么意思,例如: if type(s) !=str: 或 type(i) !=int: ?谢谢
  • 我相信您知道“==”测试是否相等。 “!=”与此相反。它测试不平等。这就像说“不是==”。这有意义吗?
【解决方案2】:

首先,进行一些清理工作。我并不完全相信您的原始课程 DNAFeature 实际上是正确的。 DNAFeature 似乎是从其他一些名为 Range 的类继承而来的,我们在这里缺少这些类,因此如果您有该代码,请也提供它。在那个原始类中,您需要定义变量 SeqName (另外,最好将变量保持小写),否则 self.SeqName 将毫无意义。此外,除非它们是从 Range 类继承的,否则您还应该定义方法“setStart”和“setEnd”。你的 getter 不应该有任何额外的变量,所以请随意将其更改为“def getSeqName(self)”而不是添加“s”。我不确定您的代码还应该做什么,所以我会保留任何进一步的评论。

此外,尽管您在评论中另有说明,但我必须从命名约定(以及我从 bio 中记得的一点点)相信您实际上希望 GeneModel 成为一组 DNAFeature 实例的容器。这与 GeneModel 子类化 DNAFeature 不同。如果我是对的,那么你可以试试:

class GeneModel(object):

    def __init__(dnafeatures):
        self.dnafeatures = dnafeatures

    def get_features(self):
        return self.dnafeatures

    def add_feature(self, feature):
        self.dnafeatures.append(feature)

这里的 dnafeatures 只是一个 dnafeature 实例的列表。这将允许您编写方法来访问这些功能并做任何您需要做的有趣的事情。

我的建议是确保您的 DNAFeature 类是正确的,以及您希望如何解决问题的模型(就您的类所做的而言),并在它更清晰时再次尝试询问。希望这会有所帮助!

【讨论】:

  • 我已经更新了我的原始类 Range,由于某种原因,不确定为什么它在类 Range 行和下一行之间看起来不完美。我不确定子类 DNAFeature 是否正确,因为我没有任何测试文件来测试它。但希望你能帮助我弄清楚原来的班级。非常感谢
  • 感谢您更新 Range 课程。看起来您仍然需要将 SeqName 添加到 DNAFeatures。否则,我相信您仍然可以使用我的骨架 GeneModel 类并添加您认为合适的方法。当你学习 Python 时,你会发现更 Python 的做事方式(比如做 (self.end-self.start) 而不是 len(range(self.start, self.end)) 但希望这会开始你走了。
  • 我明白了,我会试试的,非常感谢 jlv,您的指导对我帮助很大。再次感谢
猜你喜欢
  • 2014-09-10
  • 2015-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-14
相关资源
最近更新 更多