是否存在Pythonic泛型“null依赖”?

时间:2015-02-27 14:42:57

标签: python dependencies

我经常发现自己处于一个类具有可选依赖项的情况。例如,以下为notifier

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 个答案:

答案 0 :(得分:1)

我说1)是一种有效的解决方案,也称为Null Object Pattern 我看到另一种可能的解决方案:
1)删除依赖关系,并在notifier课程外拨打Example,即在致电doTheBusiness之后 2)也许使用Obeserver Pattern