什么时候在python中使用class与dict?

When to use class versus dict in python?

在考虑设计时,在哪些情况下使用类与dict有意义?利弊也是有用的。

例如,

1
2
3
4
5
6
7
8
9
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())

对战

1
2
3
albumstate['album'] = album
albumstate['photos_shown'] = []
albumstate['photos_notshown'] = range(album.size())


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

如果您只需要将几个数据放在一起,那么字典可能就是解决问题的方法。另一方面,如果您需要对该数据执行操作,并且数据和操作之间存在非常紧密的关系(形成一种实体),那么这实际上需要使用一个类。

正如@ben所建议的,当你有一堆相关的数据时,你可以开始使用一个字典,如果在某个时刻你意识到你也需要一些逻辑来处理这些数据,你可以把字典变成一个类。

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


dict可以使用任何哈希值作为键,而class实例需要使用合法标识符作为其"键"的字符串。因此,您可以将任意数据捆绑在dict中。

当您的键值都是有效的标识符字符串时,使用一个普通的类作为更方便的dict是很常见的:

1
2
3
4
5
6
7
8
9
10
11
12
13
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中是有意义的。

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

1
2
3
print(x.a)  # prints 1

print(x.__dict__["a"])  # does exact same thing as previous line