Найти - Пользователи
Полная версия: Передача объекта вниз по иерархии
Начало » Python для новичков » Передача объекта вниз по иерархии
1
Neka
Здравствуйте!
Я не силен в питоне, а ООП в нем же начал использовать только в текущем скрипте.

Сейчас пишу слушатель и разбиратель логов, полученных по UDP. В нем такаяиерархия:
server (запускной файл)
- LogHandler
- ProcessAction
- Database

Код запускного файла вот (в процессе разработки еще):
#!/usr/bin/python
# Copyright (c) Twisted Matrix Laboratories.
# See LICENSE for details.
from twisted.internet import reactor
from twisted.internet.protocol import DatagramProtocol
from LogHandler import LogHandler
from Database import Database
def main():
    reactor.listenUDP(29876, ProcessUDP())
    reactor.run()
if __name__ == '__main__':
    main()
                                        
class ProcessUDP(DatagramProtocol):
    def datagramReceived(self, datagram, address):
        handler = LogHandler()
        result = handler.parseLine(datagram)
        if result:
            print result

При создании объекта Database в конструкторе создается соединение с MySQL, и мне нужно его поддерживать открытым на протяжении всего цикла reactor.run(). Тоесть объект Database должен создаваться единожды, и должен быть уникальным на протяжении всей жизни скрипта.

Как же это сделать правильно? Может синглтон? Глобальный объект? еще какой способ?

Спасибо за ответы!)
Soteric
Синглтон вполне себе подойдет. Если у него сделать метод getConnection(), возвращающий подключение к базе, то Database по необходимости можно будет изменять не переписывая остальной код. Например, сделать из него впоследствии пул коннектов.
Neka
Хорошо, спасибо! Так и сделал
вот еще в DatagramRecieved() методе класса ProcessUDP создается экземпляр класса LogHandler(), этот класс не синглтон. Получается при каждом вызове DatagramRecieved будет создаваться еще один LogHandler? Как в питоне со сборщиком мусора? Есть ли советы по этому пункту?
Soteric
Со сборщиком мусора хорошо, но создавать отдельный логгер на каждый пакет нехорошо. Его можно создавать при инициализации ProcessUDP.
class ProcessUDP(DatagramProtocol):
def __init__(self):
DatagramProtocol.__init__(self)
self.handler = LogHandler()

def datagramReceived(self, datagram, address):
result = self.handler.parseLine(datagram)
if result:
print result
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB