Python OOP init
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())
Привет,
Я просто хочу уточнить, как данные проходят через класс. Например, являются ли данные в () в DangerousVirus = Sequence('atggagagccttgttcttggtgtcaa') собственными или последовательными?
Я запутался в том, как init может иметь 2 переменные, когда в () только 1. Не означает ли это, что только self содержит последовательность, а seqstring пуста?
Спасибо за помощь! (:
3 ответа
self
является ссылкой на последовательность, которая инициализируется. Строка данных передается как seqstring
, Вы можете увидеть это, добавив строку для печати:
print(seqstring)
Как сказали другие ответы, self
arg автоматически передается вызовам метода. Поэтому вы должны включить его в качестве первого аргумента в определении метода, но не должны включать его в вызов метода.
Однако для этого нет необходимости определять класс, достаточно простой функции. И вы можете использовать встроенный 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
__init__
Метод действительно принимает два аргумента, но как только экземпляр создан, self
аргумент "привязан" к экземпляру (__init__
становится так называемым связанным методом экземпляра), поэтому вам больше не нужно указывать сам экземпляр. Если вы называете несвязанным __init__
функция из класса, как это
Sequence.__init__(instance, seqstring)
Вы действительно должны указать экземпляр явно. Имя self
это просто соглашение, это может быть что угодно в определении. Взгляните на раздел учебника по методам экземпляров, где это объясняется.