我经常发现自己处于类具有可选依赖项的情况。比如下面的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
是否为 None
为了代码可读性,我更喜欢第一种选择,但它涉及到必须为每个依赖项(尽管非常小)编写一个实现。
为了避免这种情况,我一直在考虑如下通用依赖项:
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) 是一个有效的解决方案,也称为 Null Object Pattern .
我看到另一种可能的解决方案:
1) 移除依赖并在Example
类之外调用notifier
,即在调用doTheBusiness
之后
2)也许使用Obeserver Pattern ?
关于python - 是否有 Pythonic 泛型 "null dependency"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28767666/