2

最后几个弱点,我在玩一点 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()

现在,如果调用了我的网络浏览器中的适当站点,我想访问方法getItem()getDate()(属于实例)。my我现在的问题是:我应该将实例设为全局还是更好,如果我将其设为本地?我真的不喜欢全局实例,但我没有看到任何其他方法可以使其成为全局实例。当然,可以创建一个本地实例,但是每次页面加载时,都会创建一个新实例,对吗?通常,这不会是一个问题,但会myclass访问一个串行端口,所以我需要确保只创建一个实例。

我是否遗漏了什么或者全局实例是完成此任务的唯一可能解决方案?

4

1 回答 1

1

经过一番研究,我得出结论,全局实例是这里的路。但是,如果将全局实例与 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()
于 2013-10-06T18:54:48.990 回答