我有一个模型:
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
类的自己的实例吗?
答案 0 :(得分: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]