【问题标题】:When to use class versus dict in python? [closed]什么时候在 python 中使用 class 和 dict? [关闭]
【发布时间】:2012-06-21 21:57:41
【问题描述】:

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

【问题讨论】:

标签: python


【解决方案1】:

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

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

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

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

【讨论】:

  • 我只想补充一下,如果你认为你只想要数据关联,但随后需要逻辑,你可以很容易地获取一个 dict 并将其转换为稍后的类。另外,请考虑使用 defaultdict,因为它看起来会按照您希望的方式运行。
【解决方案2】:

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))

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

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

print(x.a)  # prints 1

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

【讨论】:

  • 优秀的答案。尤其是这部分:“......并且您有与数据一起使用的方法函数,您希望将数据放在适当的类中,以便您可以将方法函数捆绑在其中。只有一个 dict 和少数几个是合法的对其进行操作的全局函数,但如果它们都是相关的,则将它们捆绑到 class" 中才有意义。这是 OOP 的主要卖点之一:捆绑方法和数据,因此我们不必拥有对松散变量进行操作的全局函数。
猜你喜欢
  • 1970-01-01
  • 2016-05-14
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
  • 2013-08-01
  • 2018-06-20
  • 2015-07-16
  • 1970-01-01
相关资源
最近更新 更多