Регистрация событий в Python; Как регистрировать события внутри классов? - PullRequest
0 голосов
/ 28 октября 2009

Я построил (просто для удовольствия) 3 класса, чтобы помочь мне регистрировать некоторые события в моей работе.

вот они:

class logMessage:

    def __init__(self,objectName,message,messageType):
        self.objectName = objectName
        self.message = message
        self.messageType = messageType
        self.dateTime = datetime.datetime.now()

    def __str__(self):
        return str(self.dateTime) + "\nObjeto de valor " + str(self.objectName) + " gerou uma mensagem do tipo: " + self.messageType + "\n" + self.message + "\n"

class logHandler():

    def __init__(self):
        self.messages = []

    def __getitem__(self,index):
        return self.messages[index]

    def __len__(self):
        return len(self.messages)

    def __str__(self):
        colecaoString = ""
        for x in self.messages:
            colecaoString += str(x) + "\n"

        return colecaoString

    def dumpItem(self,index):
        temp = self.messages[index]
        del self.messages[index]
        return str(temp)

    def append(self,log):
        if isinstance(log,logMessage.logMessage):
            self.messages.append(log)
        else:
            self.newLogMessage(log, "Wrong object type. Not a log message. Impossible to log.","Error")

    def newLogMessage(self,objectInstance,message,messageType):
        newMessage = logMessage.logMessage(objectInstance,message,messageType)
        self.append(newMessage)

Вот мой вопрос:

Представьте, что у меня есть другие классы, такие как Employee, и я хочу записать событие, которое произошло ВНУТРИ этого класса.

Как я могу сделать это, не передавая экземпляр logHandler каждому другому классу, в который я хочу войти? Моя идея состояла бы в том, чтобы передать logHandler каждой init функции, а затем использовать ее внутри нее.

Как это можно сделать, не делая то, что я указал?

Как это будет работать с глобальным logHandler? Есть ли способ обнаружить во время выполнения, если в программе есть экземпляр logHandler, и использовать его для создания сообщений?

Спасибо

Ответы [ 2 ]

1 голос
/ 29 октября 2009

Вы можете использовать шаблон Борг , что означает, что вы можете создавать локальные экземпляры вашего объекта логгера и при этом иметь доступ к одному и тому же состоянию. Кто-то скажет, что это элегантно, кто-то скажет, что это сбивает с толку. Вам решать. :)

1 голос
/ 28 октября 2009

Просто создайте экземпляр ваших классов в модуле, который вы разместили. Затем просто импортируйте свой модуль регистрации в каждый файл, из которого вы хотите войти, и сделайте что-то вроде этого:

yourloggingmodule.handler.newLogMessage(...)

Где handler - имя созданного вами экземпляра.

...