2016-03-31 12 views
1

こんにちは私は、DNAの各塩基の塩基含有量を計算する簡単なプログラムを作成しようとしています。私は私の現在の設定または「no_c定義されていません」「no_c代入する前に参照した」と私は問題を解決する方法を見つけ出すことはできません割り当てエラーを取得しておく。Pythonのインスタンス変数?代入エラーを取得し続ける

#!/usr/bin/python 

#computing the atgc content of a DNA string 


class Base_counter(object): 
    def __init__(self, DNA): 
     self.DNA = DNA 
     no_c = 0 
     no_a = 0 
     no_g= 0 
     no_t= 0 

    def c_counter(self): 
     for base in self.DNA: 
      if base == 'c': 
       no_c = no_c + 1 
     return no_c 

    def g_counter(self): 
     for base in self.DNA: 
      if base == 'g': 
       no_g+=1 
     return no_g 

    def a_counter(self): 
     for base in self.DNA: 
      if base == 'a': 
       no_a+=1 
     return no_a 

    def t_counter(self): 
     for base in self.DNA: 
      if base == 't': 
       no_a+=1 
     return no_t 

    def gc_percentage(self): 
     return no_c + no_g/len(self.DNA) 

    def at_percentage(self): 
     return no_a + no_t/len(self.DNA) 

    def g_percentage(self): 
     return no_g/len(self.DNA) 

    def a_percentage(self): 
     return no_a/len(self.DNA) 

    def t_percentage(self): 
     return no_t/len(self.DNA) 

    def c_percentage(self): 
     return no_c/len(self.DNA)  

def main(): 
    dna= 'gcgctat' 
    analyzer = Base_counter(dna) 

    print analyzer.no_c 
    print analyzer.c_counter() 
    #print analyzer.c_percentage() 

if __name__ == '__main__': 
    main() 
+1

問題に遭遇したときの設定を説明するのではなく、後で人々が検索するのに役立つように、質問にタグを付けるようにしてください。例えば、この質問は、バイオインフォマティクスまたはDNAシーケンシングとは関係がありません。 –

答えて

0

ちょうど前のすべてのself.を置きますクラスのno_値は、それらの各クラスのインスタンスオブジェクトのメンバー作るためにこのよう

:。

class Base_counter(object): 
    def __init__(self, DNA): 
     self.DNA = DNA 
     self.no_c = 0 
     self.no_a = 0 
     self.no_g= 0 
     self.no_t= 0 

    def c_counter(self): 
     for base in self.DNA: 
      if base == 'c': 
       self.no_c += 1 
     return self.no_c 

など

これは、特定のクラスのインスタンスに値用の独自のストレージがあり、それを参照できるようにするために必要です。

+3

クラスのメンバーですか?オブジェクトメンバーではない? – cdarke

+1

@cdarke - reworded! –

2

self.DNA = DNA 

のみ行はこのオブジェクトのメンバーを作成します

def __init__(self, DNA): 
    self.DNA = DNA 
    no_c = 0 
    no_a = 0 
    no_g= 0 
    no_t= 0 

あなたのコードを考えてみましょう。他の行は、この関数のローカルなマッピングを作成します。したがって、後で呼び出すときにno_cにアクセスしようとすると、インタプリタはそれをあなたがここに意図したものに接続しません。

no_cのすべての出現をself.no_cに置き換えたいと思っています。

0

はこの試してみてください。具体的に

def c_counter(self): 
     for base in self.DNA: 
      if base == 'c': 
       self.no_c = self.no_c + 1 
     return self.no_c 

、アクセス自己キーワードを持つオブジェクトのすべてのフィールド。

関連する問題