2017-08-05 65 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]