web.py:避免全局实例?

时间:2013-08-25 23:44:28

标签: python instance global web.py

最后几个弱点,我正在使用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()

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

我是否遗漏了某些内容或全局实例是唯一可能实现此目标的解决方案?

1 个答案:

答案 0 :(得分: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()