34

在考虑设计时,在哪些情况下使用 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())
4

2 回答 2

29

我想说区分是使用类还是字典的第一个也是最重要的标准是您是否只想拥有一些数据存储或者您还想要一些逻辑(即方法)。

如果您只需要将多个数据保存在一起,那么字典可能是您的最佳选择。另一方面,如果您需要对该数据执行操作,并且数据和操作之间存在非常紧密的关系(形成一种实体),那么这确实需要使用类。

正如@Ben 所建议的那样,当您拥有一堆相关数据时,您可以开始只使用字典,并且如果在某个时候您意识到您还需要一些逻辑来处理该数据,您可以将字典变成一个类。

您还可以查看统一建模语言 (UML)及其类图,以更好地了解如何使用类。如果您只是在编写一些脚本或编写一个小型应用程序,您可能不需要使用 UML,但如果您正在设计一个更大、更复杂的系统,它确实可以帮助您预先决定需要什么以及需要多少类。

于 2012-06-19T19:41:02.933 回答
18

Adict可以使用任何可散列值作为键,而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))

一旦您开始进行正确的面向对象设计,并且您拥有与数据一起使用的方法函数,您希望将数据放在适当的类中,以便将方法函数捆绑在其中。只有一个 dict 是合法的以及一些对其进行操作的全局函数,但如果它们都是相关的,那么将它们捆绑到一个class.

最后,请注意 adict是用于实现 a 的构建块class。如果您将值存储在类中,它们实际上存储在内部dict,并且只有一些方便的语法来访问它们。

print(x.a)  # prints 1

print(x.__dict__["a"])  # does exact same thing as previous line
于 2012-06-19T21:29:05.217 回答