OOP:初始化类时使用条件语句

时间:2018-06-05 21:21:40

标签: python class oop initialization conditional

这个问题面向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

2 个答案:

答案 0 :(得分:1)

这似乎是factory class的一个很好的用例,它封装了条件,并且总是返回N个类之一的实例,所有这些实现相同的接口,以便代码的其余部分可以使用它而不关心使用的具体类。

答案 1 :(得分:0)

这是一种方法。但我宁愿使用类似创建动态类实例的东西。要做到这一点,你可以只有一个类,而不是从两个不同的类中选择。然后,该类将接受一些参数并根据提供的参数返回结果。有很多例子,我相信你可以在你的用例中使用它们。尝试搜索如何在python中创建动态类。