这个问题面向OOP最佳实践。
背景:
我创建了一组脚本,这些脚本由cronjobs自动触发,或者在后台持续运行以实时收集数据。在过去,我使用Python的smtplib在发生错误或成功完成作业时发送自己的通知。最近,我将这些程序迁移到Google云平台,该平台默认阻止流行的SMTP端口。为了解决这个问题,我使用linux的mail命令继续向自己发送报告。
最初,我的hacky解决方案是有两个独立的模块,用于发送根据我传递给主脚本的参数发起的警报。
例如:
$ python mycode.py my_arg
if sys.argv[1] == 'my_arg':
mailer = Class1()
else:
mailer = Class2()
我希望对此进行改进并创建一个模块,在没有添加代码的情况下自动处理此模块。我的问题是在初始化类以处理这种情况时是否“适当”包含条件语句。
例如:
Class Alert(object):
def __init__(self, sys.platform, other_args):
# Google Cloud Platform
if sys.platform == "linux":
#instantiate Class1 variables and methods
#local copy
else:
#instantiate Class2 variables and methods
我的直觉说这是错的,但我不确定适当的做法是什么。
我最感兴趣的是关于如何创建处理环境依赖关系以提供相同服务的OO类/模块的答案。就我而言,阻塞端口需要一组不同的代码。
编辑:经过一些建议后,我最喜欢这个主题的读物。
http://python-3-patterns-idioms-test.readthedocs.io/en/latest/Factory.html
答案 0 :(得分:1)
这似乎是factory class的一个很好的用例,它封装了条件,并且总是返回N个类之一的实例,所有这些实现相同的接口,以便代码的其余部分可以使用它而不关心使用的具体类。
答案 1 :(得分:0)
这是一种方法。但我宁愿使用类似创建动态类实例的东西。要做到这一点,你可以只有一个类,而不是从两个不同的类中选择。然后,该类将接受一些参数并根据提供的参数返回结果。有很多例子,我相信你可以在你的用例中使用它们。尝试搜索如何在python中创建动态类。