Domanda

Ho creato (solo per divertimento) 3 classi per aiutarmi a registrare alcuni eventi nel mio lavoro.

eccoli qui:

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)

Ecco la mia domanda:

Immagina di avere altre classi, come Employee, e voglio registrare un evento accaduto ALL'INTERNO di quella classe.

Come posso farlo senza passare sempre un'istanza logHandler a tutte le altre classi che voglio registrare? La mia idea sarebbe quella di passare un logHandler a ogni funzione init , e quindi usarlo al suo interno.

Come può essere fatto, senza fare ciò che ho specificato?

Come funzionerebbe con logHandler globale? Esiste un modo per scoprire in runtime se esiste un'istanza logHandler nel programma e utilizzarla per creare i messaggi?

Grazie

È stato utile?

Soluzione

Crea semplicemente un'istanza delle tue classi nel modulo che hai pubblicato. Quindi importa semplicemente il modulo di registrazione in ogni file da cui desideri accedere e fai qualcosa del genere:

yourloggingmodule.handler.newLogMessage(...)

Dove gestore è il nome dell'istanza che hai creato.

Altri suggerimenti

È possibile utilizzare il modello Borg , il che significa che è possibile creare istanze locali del proprio logger oggetto e tuttavia far loro accedere allo stesso stato. Alcuni direbbero che è elegante, altri potrebbero dire che è confuso. Tu decidi. :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top