2015-02-27 3 views
2

Я часто оказываюсь в ситуации, когда класс имеет необязательную зависимость. Например, notifier в следующем.Существует ли общая «нулевая зависимость» Pythonic?

class Example(object): 
    def __init__(self, notifier=None): 
     self._notifier = notifier or DummyNotifier() 

    def doTheBusiness(self): 
     doSomeWork() 
     self._notifier.notifyComplete() 

Как notifier является необязательным, у меня есть два варианта:

  • Если ни notifier не подается, поставить на его место в DummyNotifier (в соответствии с примером выше), где DummyNotifier является реализацией зависимость, которая не выполняет никаких действий
  • В doTheBusiness, проверьте notifier не является ли Никто перед вызовом ничего на нем

Я предпочитаю первый вариант считывания кода, но это связано с необходимостью создания реализации для каждой зависимости (хотя и очень маленькой).

Чтобы избежать этого, я думал о родовой зависимости следующим образом:

class GenericDependency(object): 
    def generic(self, *args, **kwargs): 
     pass 
    def __getattr__(self, _): 
     return self.generic 

Затем я могу вызвать любой метод на этом:

gd = GenericDependency() 
gd.notifyComplete() 
gd.anythingElse("also", "works", "with", any="arguments") 

(Это, очевидно, работает только для действий - не функции, для которых требуется возвращаемое значение.)

Мой вопрос - (1) это Pythonic (2) есть лучший способ?

ответ

1

Я бы сказал, 1) является допустимым решением, также известным как Null Object Pattern.
я вижу еще возможные решения:
1) Удалите зависимость и называют notifier вне Example класса, то есть после вызова doTheBusiness
2) Может использовать Obeserver Pattern?