【问题标题】:OOP: Using conditional statement while initializing a classOOP:在初始化类时使用条件语句
【发布时间】:2018-06-05 21:21:39
【问题描述】:

这个问题针对 OOP 最佳实践。

背景:

我创建了一组脚本,它们要么由 cronjobs 自动触发,要么在后台不断运行以实时收集数据。过去,我使用 Python 的 smtplib 在发生错误或作业成功完成时向自己发送通知。最近,我将这些程序迁移到了谷歌云平台,该平台默认阻止流行的 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

【问题讨论】:

  • 为什么不创建一个返回一个或另一个类的实例的函数?

标签: python class oop initialization conditional


【解决方案1】:

这似乎是 factory class 的一个绝妙用例,它封装了条件,并始终返回 N 个类之一的实例,所有这些类都实现相同的接口,以便您的其余代码可以使用它不关心正在使用的具体类。

【讨论】:

【解决方案2】:

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

【讨论】:

  • 谢谢!我会调查一下。是的,这就是想法,不调用其他类,而是包含它们的代码。我只是不知道它叫什么。
猜你喜欢
  • 1970-01-01
  • 2010-09-13
  • 2018-02-03
  • 2017-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多