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

时间:2012-03-26 20:07:35

标签: python oop metaprogramming

我正在尝试使用logging memory handler来缓冲日志消息到我的实际日志记录处理程序。您可以通过使用某些参数对其进行实例化来使用内存处理程序,如下所示:

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

但是,我不希望我的应用程序必须实例化直接记录处理程序,或传递任何参数;我希望这段代码看起来像这样:

import myhandlers
buffered_handler = myhandlers.BufferedRemoteHandler()

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

4 个答案:

答案 0 :(得分:4)

也许PEP 8的第3点就是答案:

Simple is better than complex.

我会去功能方式。也许可以称之为get_handler()(或get_buffered_remote_handler()),所以你会发现乍一看它不是真正的类。

答案 1 :(得分:1)

是的,只是让它成为一个功能。像getMemoryHandler()这样的东西。这是最好的方法。此外,如果只有一个MemoryHandler实例,你可能想让它成为单身。

答案 2 :(得分:1)

要回答您的确切问题,如果您愿意,可以覆盖子类上的__new__()以返回除您之外的类的实例。

import logging

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

但我实际上建议使用这个功能。

答案 3 :(得分:0)

嗯,直接回答你,是的,有__new__()。但是,我认为可能更简单的解决方案是硬编码或允许将特殊处理程序定义注册到myhandler。你可以在myhandlers中为你想要的每个处理程序定义一个成员方法,只需要实例化MemoryHandler并返回它。