2009-10-28 101 views
0

我建立了(只是爲了好玩)3班,幫助我記錄我的工作中的一些事件。在Python中記錄事件;如何在類中記錄事件?

這裏有他們:

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) 

這裏是我的問題:

可以想象我有其他類,如員工,我想記錄那些發生內部的類的事件。

我怎麼能做到這一點,而不總是將logHandler實例傳遞給我想要登錄的其他類?我的想法是將logHandler傳遞給每個init函數,然後在其中使用它。

如何做到這一點,而不做我指定的?

它將如何與全局logHandler一起工作?有沒有辦法在運行時發現程序中是否有logHandler實例,並使用它來創建消息?

感謝

回答

1

只要你貼在模塊中創建類的實例。然後,只需導入你的日誌模塊中你想從記錄每個文件和做這樣的事情:

yourloggingmodule.handler.newLogMessage(...) 

哪裏handler是您創建的實例的名稱。

+0

感謝您的答案Pynt。這是我想避免的,但這是一個好的解決方案。 任何其他的思想? – 2009-10-28 19:32:30

1

您可以使用Borg pattern,這意味着您可以創建記錄器對象的本地實例,並讓它們訪問相同的狀態。有人會說這很優雅,其他人可能會說這很混亂。你決定。 :)

+0

這是一個非常有趣的概念。我做了檢查,我可能會採取這條道路來完成我所需要的。 謝謝! – 2009-10-29 11:04:52