在考虑设计时,在哪些情况下使用class与dict是否有意义?优点&缺点也很有用。
例如,
class AlbumState:
""" AlbumState class, tracks photos shown, etc"""
def __init__ (self, album):
""" album for this object will track state"""
self.album = album
self.photos_shown = []
self.photos_notshown = range(album.size())
与
albumstate['album'] = album
albumstate['photos_shown'] = []
albumstate['photos_notshown'] = range(album.size())
答案 0 :(得分:28)
我想说区分是使用类还是字典的第一个也是最重要的标准是你是想要一些数据存储,还是想要一些逻辑(即方法)。
如果您只需要将多个数据保存在一起,那么字典可能就是您的选择。另一方面,如果您需要对该数据执行操作,并且数据与操作(形成一种实体)之间存在非常紧密的关系,那么这确实需要使用类。
正如@Ben建议的那样,当你有大量相关数据时,你可能会开始只使用字典,如果在某些时候你意识到你还需要一些逻辑来存储这些数据,你可以将字典变成一个类
您还可以查看Unified Modeling Language (UML)及其class diagrams,以便更好地了解如何使用课程。如果您只是编写一些脚本或编写一个小应用程序,您可能不需要使用UML,但如果您正在设计一个更大更复杂的系统,它可以帮助您事先确定您需要什么类和多少类。 / p>
答案 1 :(得分:16)
dict
可以使用任何哈希值作为键,而class
实例需要将合法标识符的字符串作为其“键”。因此,您可以将dict
中的任意数据捆绑在一起。
当你的键值全部都是有效的标识符字符串时,使用普通类作为一个更方便的dict
是很常见的:
class Box:
pass
x = Box()
x.a = 0
x.b = 1
d = {}
d["a"] = 0 # "x.a" is easier to type than this
d["b"] = 1
print("Current value for 'a' is: {}".format(x.a))
一旦你开始进行适当的面向对象设计,并且你有方法函数与数据一起使用,你希望将数据放在适当的类中,这样你就可以将方法函数捆绑在一起。这是合法的有一个字典和一些全局函数可以对它进行操作,但是如果它们都是相关的,那么将它们捆绑到class
中是有意义的。
最后,请注意dict
是一个用于实现class
的构建块。如果您将值存储在类中,它们实际上存储在内部dict
中,并且只有一些方便的语法来访问它们。
print(x.a) # prints 1
print(x.__dict__["a"]) # does exact same thing as previous line