首先,我想指出我了解OOP概念并理解字典和类之间的差异。我的问题是关于在这种情况下有意义的设计是明智的:
我在python中设计一个webapp,我必须代表一个像书对象的东西。 书籍的章节和章节都有标题和内容。为简单起见,我们可以说内容是纯文本。
我的问题是,我应该制作书籍和章节课程或词典吗?我知道使用book.chapter而不是book ['chapter']看起来更整洁,如果我将来最终有方法,将它们放入书类可能是有意义的。但是,我想知道使用类而不是将信息存储在字典中是否有任何开销?
如果我不想每次都从数据库中实例化一个book对象并将其存储为pickle,那么如果我从类中添加/删除数据成员,我就不得不担心与过去的book对象不兼容。觉得在字典中处理这个问题会更容易。有关使用词典而不是类是否有意义的任何指示?
答案 0 :(得分:10)
这高度不太可能成为您应用程序的瓶颈,因此担心性能可能是浪费时间。但是,如果这是瓶颈,或者您只是有时间,请使用namedtuple
。它将tuple
的不变性和低内存占用与类属性的良好语法相结合。
答案 1 :(得分:8)
一些想法:
如果从字典开始,您可以随后切换到实现映射协议(或子类dict)的自定义类。所以这可能是一个很好的起点。
您可以定义自定义Python对象以使用__slots__
,如果您拥有大量对象,这将更快,内存效率更高。
如果你使用一个自定义的Python对象,将来用C语言编写的对象将更容易替换它。(我从来没有尝试过,但我希望从C语言中继承dict是一个棘手的主张。)
答案 2 :(得分:5)
你实际上总结了很好的权衡。似乎很多人对性能过早担心。我建议你在网上搜索“Knuth premature optimization”,而不是重复关于这个主题的标准建议。事实上,对于已知结构的对象,使用基于类的对象比使用dicts更快乐。
同样,您希望每次从数据库中读取(实例)数据时都不实例化对象,这表示对程序设计的错误部分略有不健康的关注。从数据属性创建一个类的实例只需要很少的时间,并且通过方法添加行为的便利性非常值得额外的复杂性。
使用带有常量下标的dict来引用数据对象的元素似乎是错误的。您正在有效地模拟Python的命名空间机制并创建许多不必要的字符串常量(这些常量不一定由解释器合并)。如果你真的对速度感兴趣,为什么不使用一个列表,字段名称的符号常量?答案:因为以这种方式扭曲你的代码是错误的,因为在所有情况下99%的情况(我刚刚从我的屁股中取出的数字)不会被注意到因为应用程序不受CPU限制。
以最简单的方式编写程序。如果它运行得足够快,那就继续下一个任务。
答案 3 :(得分:4)
最初创建对象是为了将数据与功能捆绑在一起。如果您只想存储数据,请使用词典。如果要包含操作数据的方法,请使用对象。
答案 4 :(得分:1)
有点类似于您的问题:Returning an object vs returning a tuple
没有明确的选择。字典快速,美观,干净。毕竟,类实例是一个特殊的字典。如果你想提供一种方法来添加功能并在以后更改你的界面,一个类将是最好的选择,但过度设计简单的东西总是一个糟糕的选择。 Python不是java,其中一切都必须是正确类的实例。这也是我犯下的罪。
答案 5 :(得分:1)
如果您使用对象,我不会仅仅因为您提供的原因而将数据存储在数据库中。如果你接受了语言或类似的改变,那将会更糟。
FWIW,我会先从字典开始。如果事情变得复杂或需要新功能,请将其作为对象。