最后几个弱点,我在稍微玩玩Web.py框架。随着我的应用程序越来越大,我想重构源代码并将代码片段放在不同的类中。现在,如果我在不同的 web.py 类中需要它们,我真的不知道应该在哪里创建我的对象实例。让我们假设,我的源代码如下所示:
import web
import myclass
urls = (
'/', 'index',
'/test', 'test'
)
#should i make my instance global...
my = myclass.myClass()
class test:
def __init__(self):
#...or should i make my instance local: my = myclass.myClass()
pass
def GET(self):
item = my.getItem()
return item
def POST(self):
pass
class index:
def __init__(self):
#...or should i make my instance local: my = myclass.myClass()
pass
def GET(self):
date = my.getDate()
return date
if __name__ == "__main__":
app = web.application(urls, globals())
app.run()
现在,如果我的网络浏览器中的适当站点被调用。我现在的问题是:我应该将实例设置为全局实例还是更好,如果我将其设置为本地实例?我真的不喜欢全局实例,但我看不出有任何其他方法可以使其全局化。当然,可以创建一个本地实例,但是每次加载页面时,都会创建一个新实例,对吧?通常,这不是问题,但是 myclass 访问串行端口,所以我需要确保只创建了一个实例。
我是不是遗漏了什么,或者全局实例是唯一可能的解决方案吗?
请您参考如下方法:
经过一些研究,我得出结论,全局实例是实现此目的的方式。但是,如果全局实例与 web.py 自动重新加载模式一起使用,则必须小心。在自动重新加载模式下,每次加载新页面时都会创建一个全局实例。如果你想避免这种情况,你必须使用这样的东西:
import web
import serial
urls = ("/(.*)", "test"
)
web.config.debug = True
if(web.config.debug):
#in debug mode, make sure that global serial instance is only created at start up
if not hasattr(serObj, "_email"):
serObj = serial.Serial(0, 9600, parity=serial.PARITY_NONE)
web._serObj = serObj
else:
serObj = web._serObj
class test:
def GET(self):
return "Test"
def POST(self):
pass
if __name__ == "__main__":
app = web.application(urls, globals())
app.run()
