Skip to main content
 首页 » 编程设计

python之web.py:避免全局实例

2025年05月04日32Terrylee

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