возвращение другого класса при создании экземпляра класса в Python - PullRequest
1 голос
/ 27 марта 2012

Я пытаюсь использовать обработчик памяти для ведения журнала , чтобы буферизовать сообщения журнала в моем фактическом обработчике ведения журнала.Вы используете обработчик памяти, создавая его экземпляры с некоторыми аргументами, такими как:

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

Однако я не хочу, чтобы мое приложение должно было создавать экземпляр обработчика для прямой регистрации или передавать любой из аргументов;Я хотел бы, чтобы этот код выглядел так:

import myhandlers
buffered_handler = myhandlers.BufferedRemoteHandler()

Вопрос: как мне это сделать?Я хотел бы попытаться создать экземпляр моего BufferedRemoteHandler до , на самом деле , вернуть в журнал MemoryHandler с некоторыми конкретными аргументами.Я думал просто сделать BufferedRemoteHandler функцией, которая возвращает нужный мне обработчик;это правильный путь?Есть ли способ создать класс, который, когда вы создаете его экземпляр, на самом деле возвращает совершенно другой класс?

Ответы [ 4 ]

4 голосов
/ 27 марта 2012

Может быть, пункт 3 из PEP 8 - это ответ:

Simple is better than complex.

Я бы пошел по функциональному пути.Возможно, назовите это чем-то вроде get_handler() (или get_buffered_remote_handler()), так что вы понимаете, что это на первый взгляд нечто отличное от реального класса.

1 голос
/ 27 марта 2012

Чтобы ответить на ваш точный вопрос, вы можете, если хотите, переопределить __new__() в своем подклассе, чтобы вернуть экземпляр класса, отличного от вашего.

import logging

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

Но я бы на самом деле предложил эту функцию.

1 голос
/ 27 марта 2012

Да, просто сделайте это функцией. Что-то вроде getMemoryHandler (). Это лучший способ сделать это. Кроме того, если вокруг будет только один экземпляр MemoryHandler, вы можете сделать его одиночным.

0 голосов
/ 27 марта 2012

Ну, чтобы ответить вам прямо, да, есть __new__(). Тем не менее, я думаю, что, вероятно, было бы более простым решением, было бы либо жестко кодировать, либо разрешить регистрировать специальные определения обработчиков в myhandlers. Вы бы определили метод member для каждого обработчика, который вы хотите, в myhandlers, который просто создает экземпляр MemoryHandler, как вам нужно, и возвращает его.

...