python - OOP:在初始化类时使用条件语句
问题描述
这个问题面向 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
解决方案
这似乎是工厂类的一个很好的用例,它封装了条件,并且总是返回 N 个类之一的实例,所有这些类都实现了相同的接口,因此您的其余代码可以使用它而无需关心正在使用的具体类。
推荐阅读
- neo4j - 与多个节点有关系的节点
- javascript - Chrome 反应扩展
- java - JTable 排序为添加和删除
- python - 是否可以连接一级和其他多级数据帧,并在轴 1 中同时具有一级和多级?(熊猫)
- javascript - rev-manifest.json 文件路径中的问题
- java - 在 Selenium Cucumber-jvm 中单独启动 Webdriver
- javascript - babel 子模块意外令牌导入
- .htaccess - .htaccess 用于将段添加到 url 的重写规则
- jquery - 包含 GET/POST 变量时,Ajax 不替换为新文本
- python - 合并2个文本文件并在python中创建一个新文件