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 ООП инициализации

Я просто хочу некоторые разъяснения относительно того, как потоки данных через класс. Например, это данные в() в DangerousVirus = Sequence ('atggagagccttgttcttggtgtcaa') self или seqstring?

Я смущен относительно того, как init может иметь 2 переменные, когда theres only 1 in(). Разве это не означает, что только я содержит последовательность, а строка является пустой?

Спасибо за помощь! (:..

+0

Вы читали [Классы] раздел (https://docs.python.org/3/tutorial/classes.html) в официальном учебнике? –

ответ

0

self является ссылкой на последовательность, которая инициализируемая строка данных передаются как Вы можете увидеть это, добавив строку печатать:

print(seqstring) 
0

Метод __init__ делает действительно возьмите два аргумента, но после создания экземпляра аргумент self «привязан» к экземпляру (__init__ становится так называемым методом привязки экземпляра), поэтому вам больше не нужно указывать сам экземпляр. unbound __init__ функция от этого класса

Sequence.__init__(instance, seqstring) 

Вы действительно должны указать экземпляр явно. Имя self - это просто конвенция, это может быть что угодно в определении. Взгляните на tutorial section on instance methods, где это объясняется.

0

Как уже говорилось в других ответах, аргумент self автоматически передается на вызовы методов. Итак, вы должны включить его в качестве первого аргумента в определении метода, но вы должны не включить его в вызов метода.

Однако для этого нет необходимости определять класс, достаточно простой функции. И вы можете использовать встроенный метод str.translate для эффективной транскрипции. Для больших последовательностей это много быстрее, чем это делается с помощью цикла Python, как в вашем методе transcription, так как большая часть работы выполняется скомпилированным кодом, поэтому он работает так же быстро, как если бы он был написан на 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