2017-08-05 62 views
1

我有一個模型:燒瓶 - 提交後不重置型號?

class DnaString: 
    complement_dict = {'A': 'T', 'T': 'A', 'G': 'C', 'C': 'G'} 
    contents = {'A': 0, 'T': 0, 'G': 0, 'C': 0} 

    @classmethod 
    def update(cls, dnastring): 
     for nucleotide in dnastring: 
      cls.contents[nucleotide] += 1 


    def __init__(self, dnastring): 
     self.dnastring = dnastring 
     self.update(dnastring) 

和一個視圖:

@protein.route('/', methods=["GET", "POST"]) 
def home(): 
    if request.method == 'GET': 
     return render_template('get_protein.html') 
    else: 
     dnastring = DnaString(request.form['dnastring']) 
     return render_template('dna_analysis.html', 
           dnacontents=dnastring.contents) 

當我進入了第一次工作的DNA串,但是如果我刷新頁面,並輸入另一個DNA串,它看起來不會創建DnaString的新實例,而是添加到相同的實例。所以,如果我在刷新後輸入一個dna字符串並輸入相同的字符串,則內容將打印出雙倍的內容。

有沒有辦法在每次運行頁面時創建一個新的DnaString實例?

我想我可以使內容類方法,而不是?但根據我的理解,對象的原因是它們各自獨立?例如,Human可以是一個類,但如果我將它分配給變量john = Human()那麼john是它自己的實例Human類?

回答

1

@classmethod是不是你想要的。這會改變一個類變量(而不是一個實例變量)。這方面的一個簡單的版本可以在這裏看到:

>>> class Foo(object): 
...  l = [] 
...  @classmethod 
...  def add(cls, x): 
...   cls.l.append(x) 
... 
>>> Foo.l 
[] 
>>> Foo.add(2) 
>>> Foo.l 
[2] 
>>> Foo.add(2) 
>>> Foo.l 
[2, 2] 

你應該實例化一個新的對象與每個請求,如果它不能持久層被發現。

>>> class Foo(object): 
...  def __init__(self): 
...   self.l = [] 
...  def add(self, x): 
...   self.l.append(x) 
... 
>>> foo1 = Foo() 
>>> foo1.add(2) 
>>> foo1.l 
[2] 
>>> foo1.add(2) 
>>> foo1.l 
[2, 2] 
>>> foo2 = Foo() 
>>> foo2.add(2) 
>>> foo2.l 
[2]