2015-12-09 5 views
-2

Привет, коллега,Python: переменные класса не обновляются

Не могу решить проблему здесь и поэтому хотел бы иметь некоторый впуск с вашей стороны.

Вот мой код:

from collections import defaultdict 

class peptide(): 

    aa_lib={ 
     'A': {'H': 5, 'C': 3, 'O': 1, 'N': 1}, 
     'C': {'H': 5, 'C': 3, 'S': 1, 'O': 1, 'N': 1}, 
     'D': {'H': 5, 'C': 4, 'O': 3, 'N': 1}, 
     'E': {'H': 7, 'C': 5, 'O': 3, 'N': 1}, 
     'F': {'H': 9, 'C': 9, 'O': 1, 'N': 1}, 
     'G': {'H': 3, 'C': 2, 'O': 1, 'N': 1}, 
     'H': {'H': 7, 'C': 6, 'N': 3, 'O': 1}, 
     'I': {'H': 11, 'C': 6, 'O': 1, 'N': 1}, 
     'K': {'H': 12, 'C': 6, 'N': 2, 'O': 1}, 
     'L': {'H': 11, 'C': 6, 'O': 1, 'N': 1}, 
     'M': {'H': 9, 'C': 5, 'S': 1, 'O': 1, 'N': 1}, 
     'N': {'H': 6, 'C': 4, 'O': 2, 'N': 2}, 
     'P': {'H': 7, 'C': 5, 'O': 1, 'N': 1}, 
     'Q': {'H': 8, 'C': 5, 'O': 2, 'N': 2}, 
     'R': {'H': 12, 'C': 6, 'N': 4, 'O': 1}, 
     'S': {'H': 5, 'C': 3, 'O': 2, 'N': 1}, 
     'T': {'H': 7, 'C': 4, 'O': 2, 'N': 1}, 
     'V': {'H': 9, 'C': 5, 'O': 1, 'N': 1}, 
     'W': {'C': 11, 'H': 10, 'N': 2, 'O': 1}, 
     'Y': {'H': 9, 'C': 9, 'O': 2, 'N': 1}, 
     'H-': {'H': 1}, 
     '-OH': {'O': 1, 'H': 1} 
    } 

    def __init__(self,sequence,rtime,intensity,protein): 
     self.sequence=sequence 
     self.carbon_atoms=0 
     self.nitrogen_atoms=0 
     self.hydrogen_atoms=0 
     self.sulfur_atoms=0 
     self.oxygen_atoms=0 

     self.rt=rtime 
     self.intensity=intensity 
     self.protein=protein 
     #self.charge=charge 

    def sumForm(self, aa_lib): 
     atom_comp = defaultdict(int) 
     for aa in self.sequence: 
      if aa in aa_lib.keys(): 
       for atom, count in aa_lib[aa].items(): 
        atom_comp[atom]+=count 
     self.carbon_atoms=atom_comp['C'] 
     self.nitrogen_atoms=atom_comp['N'] 
     self.hydrogen_atoms=atom_comp['H'] 
     self.sulfur_atoms=atom_comp['S'] 
     self.oxygen_atoms=atom_comp['O'] 

test=peptide("FKDDLA", 2.5, 2E+7, "OmpF") 
test.sumForm 

Я не понимаю, почему атомы не обновляются. Значения init (0) по-прежнему остаются вместо обновленных значений. Вне класса я могу заставить его работать.

+3

и когда вы запускаете 'sumForm'? – lejlot

+0

Извините, я забыл его добавить. Я запускаю его вот так: test.sumForm – Fourier

+0

Вы не * вызывают * 'sumForm'! – user2357112

ответ

2

У вас есть две проблемы:

  1. Вы никогда не вызывать метод, вам нужно test.sumForm().
  2. Ваш метод принимает аргумент, который вы не пройти в

Вы можете сделать test.sumForm(peptide.aa_lib), или вы можете изменить свой метод для чтения переменной из класса непосредственно, как это:.

def sumForm(self): # note, no more aa_lib here 
    atom_comp = defaultdict(int) 
    for aa in self.sequence: 
     if aa in peptide.aa_lib.keys(): # peptide.aa_lib 
      for atom, count in peptide.aa_lib[aa].items(): 
       atom_comp[atom]+=count 
    self.carbon_atoms=atom_comp['C'] 
    self.nitrogen_atoms=atom_comp['N'] 
    self.hydrogen_atoms=atom_comp['H'] 
    self.sulfur_atoms=atom_comp['S'] 
    self.oxygen_atoms=atom_comp['O'] 

Вы должны либо изменить вызов, либо изменить метод. Не используйте оба (в противном случае у вас будет целый набор ошибок).

+0

Большое спасибо. Это была моя первая попытка, и я явно не совсем понял, как это назвать. – Fourier