2010-10-11 39 views
1

我有一個Range類這樣的代碼:Python的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,表示一定範圍的也有一個鏈和序列名稱:

實施setStrandgetStrand,其設置和返回鏈信息,並setSeqNamegetSeqName,其設置或返回的功能所屬的序列的名稱。 如果一個特徵位於負(反向)鏈上,getStrand()應該返回-1。如果一個功能是正鏈上,getStrand()應該返回1,如果沒有設置鏈,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

你是什麼意思,它不'看起來是正確的?你運行它了嗎?你有沒有收到任何錯誤信息?它表現出什麼樣的行爲,你不想要?可能,你在一個編程班,而不是藝術課。 – aaronasterling 2010-10-11 20:48:04

+4

擺脫那些獲得者和制定者。 Python不是Java。即使你需要添加一些真正的邏輯到'some_range.end = ...',你可以通過屬性來完成,而不會破壞任何代碼。 – delnan 2010-10-11 20:54:57

+0

@Aaron:我導入它,但由於在seq == POSITIVE不正確的代碼,我不知道如何將getStrand設置爲響應,因爲特徵鏈是正解,它返回1,作爲特徵鏈是負數,它返回-1,沒有任何設置,返回爲0.謝謝 – pmt0512 2010-10-11 20:59:46

回答

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 

你會發現,在這裏,我已經重新定義初始化。有一個原因。我記得在你之前的一個問題中,你提到過這是一個Java任務,只是重命名爲python。在Java中,構造函數不會被繼承(如果我錯了,請糾正我)。因此,如果使用相同的評分標準,那麼在這裏不重新定義構造函數將會失去標記。

希望這會有幫助

+0

哦不,這是完全的蟒蛇,而不是Java,也許我犯了一個錯誤,告訴你它是上次的Java,對此感到遺憾,並且非常感謝代碼,真的很難得到w/getters和setters – pmt0512 2010-10-17 16:44:33

+0

我的意思是是你的教授從前幾年複製了這項任務,當時這是一項Java任務。我知道這是一個Python作業。因此,我爲什麼給你python代碼 – inspectorG4dget 2010-10-17 18:08:34

3

一般是容易得多,如果您提供的是哪裏錯了一個特定的錯誤信息或東西來回答問題。事情是這樣的,當我試圖運行上面:

  • 首先是

    `SyntaxError: invalid syntax` 
    
    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課程,並且它沒有作爲課程的一部分提供,因爲如果這是你學習的課程非常糟糕。主要的問題是使用getters和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 

查看是否可以計算出工作原理。

+0

實際上,Range類是來自我以前的任務,我的教授要求我輸入setter和getters,這就是爲什麼我在那裏,並且我運行了Range類也是如此,在這個設計中,我的教授問我們爲Range輸入該子類,它是DNAFeature以讀取DNA鏈特徵,就像其正負鏈一樣,如果沒有設置,則返回1,-1或0。 – pmt0512 2010-10-11 21:05:30

+0

對不起,但關於feature = DNAFeature(1,「foo」) 你把這行放在哪裏,在我定義seq == POSITIVE之前,它在getStrand函數下面嗎? – pmt0512 2010-10-11 21:10:54

+3

@pmt:你的教授不知道Python。正確的習慣用法是使用類屬性,並使用數據描述符(http://docs.python.org/reference/datamodel.html#descriptors),例如當您想要在訪問屬性時執行計算時使用的'property'。吸氣劑和吸附劑絕不是正確的工具。我並不完全理解你的問題,但我想你問的是如何設置一個-1,0或1的屬性。只需設置它! 'self.strand = -1',說。 'feature = DNAFeature(1,「foo」)這行代碼出現在程序的底部。 – katrielalex 2010-10-11 21:19:05