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