繁体   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