2012-03-26 139 views
1

我正在嘗試使用日誌記錄的memory handler將日誌消息緩衝到我的實際日誌處理程序。您可以通過一些參數實例它使用的內存處理,像這樣:在python中實例化類時返回另一個類

import logging 
buffered_handler = logging.handlers.MemoryHandler(capacity=5,target=myActualHandler) 

不過,我不希望我的應用程序必須從直接登錄實例的處理程序,或通過任何參數;我想這個代碼看起來像這樣:

import myhandlers 
buffered_handler = myhandlers.BufferedRemoteHandler() 

問題是:我該如何做到這一點?我想嘗試實例化我的BufferedRemoteHandler實際上返回日誌的MemoryHandler與一些特定的參數。我想只是讓BufferedRemoteHandler一個函數返回我想要的處理程序;那是正確的方法嗎?有沒有辦法創建一個類,當你實例化它時,實際上會返回一個完全不同的類?

回答

1

要回答確切的問題,您可以在您的子類上覆蓋__new__()以返回除您以外的類的實例。

import logging 

class BufferedRemoteHandler(object): 
    def __new__(cls): 
     return logging.handlers.MemoryHandler(capacity=5,target=myActualHandler) 

但我實際上建議的功能。

+0

感謝您回答這個問題!這看起來非常優雅;除簡單之外,還有其他什麼原因可以推薦功能路線嗎? – 2012-03-26 20:25:46

+0

@Igor,最不驚訝的原則呢? – 2012-03-26 21:26:31

+0

我同意。返回某個其他類的實例對於類實例化操作來說是一種令人驚訝的結果。 – kindall 2012-03-26 21:52:09

4

也許PEP 8點3是答案:

Simple is better than complex. 

我會去的作用方式。也許可以稱之爲get_handler()(或get_buffered_remote_handler()),所以你乍一看就知道它不是真正的課程。

+0

通常這種類型的函數被稱爲工廠函數。在這種情況下,您可以將其稱爲Handler Factory – 2012-03-26 21:23:20

1

是的只是讓它成爲一個功能。像getMemoryHandler()。這是做這件事的最好方法。此外,如果只有一個MemoryHandler實例將要在您身邊,您可能希望將其設爲單身。

+0

這種情況下的單例已經是'logging'模塊本身;你使用你的處理程序和設置來設置它,並且每個後續的實例化/導入都使用它們。 – 2012-03-26 20:19:05

0

那麼,要直接回答你,是的,有__new__()。但是,我認爲可能更簡單的解決方案是硬編碼或允許特殊處理程序定義註冊給處理程序。您可以爲處理器中的每個處理程序定義一個成員方法,這些處理程序只是根據需要實例化MemoryHandler並將其返回。