为什么python + pylons“记住”以前指定的类变量?

时间:2010-03-03 03:07:39

标签: python pylons

我在python + pylons中有一个提交给控制器的简单表单。但是,每个页面加载似乎都不是该类的新实例化。相反,仍可访问在上一页加载中指定的类变量。

这里发生了什么?什么是解决方案?

2 个答案:

答案 0 :(得分:1)

Pylons使用多线程应用程序服务器,并且不会从请求中清除变量。这是一个性能问题,因为重新实例化整个类树将是昂贵的。不要将用户返回的数据存储在类中,而是使用会话系统(Pylons comes with one或使用像Beaker这样的东西)或后端数据库,如SQLAlchemy,SQLObject或PyMongo。

此外,由于框架的多线程特性,您应该避免像瘟疫这样的共享对象(如全局变量),除非您非常小心地确保以线程安全的方式使用它们(例如只读) )。某些Pylons提供的对象(请求/响应)已写入线程本地,因此不必担心这些。

答案 1 :(得分:1)

一个常见的程序员监督是将list []定义为默认参数或类初始化程序仅计算一次。如果您有类变量,例如列表,我建议您在 init 中初始化它们。我给你举个例子。

>>> class Example(object):
...     a = []
...     def __init__(self):
...         self.b = []
... 

>>> foo = Example()
>>> bar = Example()

>>> foo.a
[]
>>> bar.a
[]
>>> foo.b
[]
>>> bar.b
[]

>>> foo.a.append(1)
>>> foo.b.append(2)
>>> foo.a
[1]
>>> foo.b
[2]
>>> bar.a
[1]
>>> bar.b
[]