2017-02-22 61 views
0
class Sequence: 
    TranscriptionTable = { 
     "A":"U", 
     "T":"A", 
     "C":"G", 
     "G":"C" 
    } 
    def __init__(self, seqstring): 
     self.seqstring = seqstring.upper() 
    def transcription(self): 
     tt = "" 
     for x in self.seqstring: 
      if x in 'ATGC': 
       tt += self.TranscriptionTable[x] 
     return tt 

DangerousVirus = Sequence('atggagagccttgttcttggtgtcaa') 

print(DangerousVirus.transcription()) 

嗨,Python的OOP初始化

我只想澄清如何對數據流通過類。例如,DangerousVirus = Sequence('atggagagccttgttcttggtgtcaa')中的數據是self還是seqstring?

我很困惑如何初始化可以有2個變量時,只有1個()。那是不是意味着只有self包含序列而seqstring是空的?

感謝您的幫助! (:。

+0

你讀過的[類](https://docs.python.org/3/tutorial/classes.html)節的官方教程? –

回答

0

self是正被初始化的數據串作爲傳遞的序列的參考可以通過添加一行打印看到這一點:

print(seqstring) 
0

__init__方法的確需要兩個參數,但一旦創建實例,self參數就會與實例「綁定」(__init__成爲實例的所謂綁定方法),因此您不必再指定實例本身。未綁定__init__功能類似

Sequence.__init__(instance, seqstring) 

您確實必須明確指定實例。名稱self只是一個約定,它可以是定義中的任何東西。看看這裏解釋的tutorial section on instance methods

0

正如其他答案所說,self arg會自動傳遞給方法調用。所以你必須包括它作爲方法定義中的第一個參數,但是你必須而不是在方法調用中包含它。

但是,沒有必要爲此定義一個類,只需一個簡單的函數即可。您可以使用內置的str.translate方法非常有效地執行轉錄。對於大型序列,由於大多數工作都是通過編譯代碼完成的,因此它的速度比使用Python循環更快,因爲它的運行速度與使用C語言編寫的速度相同,不像Python。

trans_table = str.maketrans('ATCG', 'UAGC') 

def transcribe(seq): 
    seq = seq.upper() 
    return seq.translate(trans_table) 

seq = 'atggagagccttgttcttggtgtcaa' 
print(transcribe(seq)) 

輸出

UACCUCUCGGAACAAGAACCACAGUU 

如文檔提到,是不是在轉換表中的任何字符將保留在輸出字符串不變。例如,

print('abcdABCD'.translate(trans_table)) 

輸出

abcdUBGD