2013-08-25 133 views
2

最近的幾個弱點,我在玩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() 

現在,我要訪問的方法getItem()getDate()(屬於實例my),如果在我的網頁瀏覽器相應的站點被稱爲。我現在的問題是:如果我把它變成本地的,我應該讓這個實例成爲全局還是更好?我真的不喜歡全局實例,但我沒有看到任何其他方式使其成爲全局實例。當然,創建一個本地實例是可能的,但是,每次頁面加載時,都會創建一個新實例,對吧?通常情況下,這不會是一個問題,但myclass訪問一個串行端口,所以我需要確保,只有一個實例被創建。

我是否錯過了某些東西或者是全局實例是唯一可行的解​​決方案?

+0

我相信它會更好地成爲一個全局對象。 – thefourtheye

回答

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() 
+0

您能否解釋一下爲什麼對'serObj'(它似乎是一個串行接口句柄?)'_email'屬性的測試可以確定是否已經創建了全局'Serial'對象?另外我想如果這個例子在'GET'方法中顯示'serObj',它可能會很有用。 – sxc731