在python中实例化类时返回另一个类

问题描述:

我正在尝试使用日志记录的memory handler将日志消息缓冲到我的实际日志处理程序。您可以通过一些参数实例它使用的内存处理,像这样:在python中实例化类时返回另一个类

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

不过,我不希望我的应用程序必须从直接登录实例的处理程序,或通过任何参数;我想这个代码看起来像这样:

import myhandlers 
buffered_handler = myhandlers.BufferedRemoteHandler() 

问题是:我该如何做到这一点?我想尝试实例化我的BufferedRemoteHandler实际上返回日志的MemoryHandler与一些特定的参数。我想只是让BufferedRemoteHandler一个函数返回我想要的处理程序;那是正确的方法吗?有没有办法创建一个类,当你实例化它时,实际上会返回一个完全不同的类?

要回答确切的问题,您可以在您的子类上覆盖__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

也许PEP 8点3是答案:

Simple is better than complex. 

我会去的作用方式。也许可以称之为get_handler()(或get_buffered_remote_handler()),所以你乍一看就知道它不是真正的课程。

+0

通常这种类型的函数被称为工厂函数。在这种情况下,您可以将其称为Handler Factory – 2012-03-26 21:23:20

是的只是让它成为一个功能。像getMemoryHandler()。这是做这件事的最好方法。此外,如果只有一个MemoryHandler实例将要在您身边,您可能希望将其设为单身。

+0

这种情况下的单例已经是'logging'模块本身;你使用你的处理程序和设置来设置它,并且每个后续的实例化/导入都使用它们。 – 2012-03-26 20:19:05

那么,要直接回答你,是的,有__new__()。但是,我认为可能更简单的解决方案是硬编码或允许特殊处理程序定义注册给处理程序。您可以为处理器中的每个处理程序定义一个成员方法,这些处理程序只是根据需要实例化MemoryHandler并将其返回。