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 это просто соглашение, это может быть что угодно в определении. Взгляните на раздел учебника по методам экземпляров, где это объясняется.

Другие вопросы по тегам