2017-02-22 64 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