Pregunta

Creé (solo por diversión) 3 clases para ayudarme a registrar algunos eventos en mi trabajo.

aquí están ellos:

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)

Aquí está mi pregunta:

Imagine que tengo otras clases, como Empleado, y quiero registrar un evento que sucedió DENTRO de esa clase.

¿Cómo puedo hacer eso sin pasar siempre una instancia de logHandler a todas las demás clases que deseo registrar? Mi idea sería pasar un logHandler a cada función init , y luego usarlo dentro de él.

¿Cómo se puede hacer eso, sin hacer lo que especifiqué?

¿Cómo funcionaría con logHandler global? ¿Hay alguna manera de descubrir en tiempo de ejecución si hay una instancia de logHandler en el programa y usarla para crear los mensajes?

Gracias

¿Fue útil?

Solución

Simplemente cree una instancia de sus clases en el módulo que publicó. Luego solo importe su módulo de registro en cada archivo desde el que desee iniciar sesión y haga algo como esto:

yourloggingmodule.handler.newLogMessage(...)

Donde handler es el nombre de la instancia que creó.

Otros consejos

Puede usar el Patrón Borg , lo que significa que puede crear instancias locales de su registrador objeto y, sin embargo, que accedan al mismo estado. Algunos dirían que es elegante, otros pueden decir que es confuso. Tú decides. :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top