在考虑设计时,在哪些情况下使用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())
Run Code Online (Sandbox Code Playgroud)
与
albumstate['album'] = album
albumstate['photos_shown'] = []
albumstate['photos_notshown'] = range(album.size())
Run Code Online (Sandbox Code Playgroud)
bet*_*ido 28
我想说区分是使用类还是字典的第一个也是最重要的标准是你是想要一些数据存储还是想要一些逻辑(即方法).
如果您只需要将多个数据保存在一起,那么字典可能就是您的选择.另一方面,如果您需要对该数据执行操作,并且数据与操作(形成一种实体)之间存在非常紧密的关系,那么这确实需要使用类.
正如@Ben建议的那样,当你有大量相关数据时,你可能会开始只使用字典,如果在某些时候你意识到你还需要一些逻辑来处理这些数据,你可以将字典变成一个类.
您还可以查看统一建模语言(UML)及其类图,以更好地了解如何使用类.如果你只是做一些脚本或编写一个小应用程序,你可能不需要使用UML,但如果你正在设计一个更大更复杂的系统,它可以真正帮助你预先确定你需要什么类和多少类.
ste*_*eha 16
A dict可以使用任何hashable值作为键,而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))
Run Code Online (Sandbox Code Playgroud)
一旦你开始进行适当的面向对象设计,并且你有方法函数与数据一起使用,你希望将数据放在适当的类中,这样你就可以将方法函数捆绑在一起.只需要一个字典是合法的以及一些在其上运行的全局函数,但如果它们都是相关的,那么将它们捆绑成一个就可以了class.
最后,请注意a dict是一个用于实现a的构建块class.如果将值存储在类中,它们实际上存储在内部,dict并且只有一些方便的语法来访问它们.
print(x.a) # prints 1
print(x.__dict__["a"]) # does exact same thing as previous line
Run Code Online (Sandbox Code Playgroud)