2013-08-25 1 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), если соответствующие сайты в моей WebBrowser называются. Теперь мой вопрос: должен ли я сделать экземпляр глобальным или лучше, если я сделаю его локальным? Мне действительно не нравятся глобальные экземпляры, но я не вижу другого способа сделать его глобальным. Конечно, было бы возможно создать локальный экземпляр, но тогда, каждый раз, когда загружается страница, будет создан новый экземпляр, верно? Обычно это не проблема, но 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

Не могли бы вы объяснить, почему тест на существование атрибута '_email' на' serObj' (который, как представляется, является дескриптором последовательного интерфейса?), Позволяет определить, был ли уже создан глобальный объект 'Serial'? Также я полагаю, что это может быть полезно, если в примере показано, что «serObj» используется в методе «GET». – sxc731