簡體   English   中英

在python中實例化一個類時返回另一個類

[英]returning another class when instantiating a class in python

我正在嘗試使用日志記錄的內存處理程序將日志消息緩沖到我的實際日志記錄處理程序中。 您可以通過使用一些參數實例化來使用內存處理程序,如下所示:

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

但是,我不希望我的應用程序必須直接從日志記錄中實例化處理程序或傳遞任何參數。 我希望這段代碼看起來像這樣:

import myhandlers
buffered_handler = myhandlers.BufferedRemoteHandler()

問題是:我該怎么做? 我想嘗試實例化BufferedRemoteHandler實際返回帶有某些特定參數的日志記錄的MemoryHandler。 我想到了使BufferedRemoteHandler一個函數返回我想要的處理程序; 那是正確的方法嗎? 有沒有辦法創建一個類,當您實例化它時,它實際上返回一個完全不同的類?

也許PEP 8的第3點是答案:

Simple is better than complex.

我會去功能的方式。 也許叫它類似get_handler() (或get_buffered_remote_handler() ),所以乍一看您就意識到它不是真正的類。

是的,只需使其功能即可。 諸如getMemoryHandler()之類的東西。 這是最好的方法。 另外,如果僅要有一個MemoryHandler實例,則可以將其設為單例。

要回答您的確切問題,您可以根據需要在子類上重寫__new__()以返回除您之外的類的實例。

import logging

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

但是我實際上建議使用該功能。

好吧,直接回答你,是的,有__new__() 但是,我認為可能更簡單的解決方案是硬編碼或允許將特殊的處理程序定義注冊到myhandlers。 您將在myhandlers中為所需的每個處理程序定義一個成員方法,該方法僅根據需要實例化MemoryHandler並返回它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM