【发布时间】:2021-09-05 01:18:05
【问题描述】:
我一直在编写代码来解析和提取机器人发送的消息中的信息。只有几种不同类型的消息,但每一种都包含我感兴趣的完全不同类型的信息,我正在努力寻找在我的代码中将它们作为对象处理的最佳方法。
如果我使用 Haskell,我只需创建一个类型 Message 并为每种消息定义一个定制的构造函数
data Message = Greeting Foo Bar | Warning Yadda Yadda Yadda | ...
将它们都放在同一个type 下并且能够轻松区分消息类型,这是一种非常好的和干净的方式。
如何以一种 OOP 友好(或更好的 Pythonic)方式设计对象类以达到这种效果? 我想到了两种方法,即:
-
定义基类
Message并为每种消息子类化它。 优点:概念上干净。 缺点:大量的样板代码,并没有真正使代码具有很强的可读性或不同消息类之间的关系清晰。 -
定义一个通用类
Message,它代表每种消息类型。它将有一个属性.type来区分消息类型,它的__init__函数将相应地实例化适合于消息类型的属性。 优点:代码简单,实用。 缺点:让类的属性如此不可预测似乎是一种不好的做法,而且通常感觉不对。
但我对两者都不完全满意。虽然我意识到这只是一个小程序,但我想我正在利用它作为学习更多关于使用抽象和软件架构的机会。谁能给我指路?
【问题讨论】:
-
这两种方法都可以,但第二种方法似乎更轻松。你可以定义一个
enum来让你更好地控制潜在的消息类型,同时保持类的描述性 -
制作一个简单的minimal reproducible example,包含几个字符串以及您打算如何使用它们。
-
你考虑过 Python 数据类吗?那些应该给你干净的代码,没有太多的样板。
-
@joshmeranda 感谢您的参与!我自己倾向于第一种方法,但是这个
enum索引确实很有趣 -
@MadPhysicist 谢谢你的回复!正如我所看到的,我的问题本质上更笼统,我不希望它过分依赖实现细节。可以这么说,我担心添加这些额外的信息会搅浑水,但如果你认为它对你有帮助,我不介意分享它。
标签: python class object oop abstraction