人物class VS。角色列表

Character class VS. Character list

在 pygame 的几乎所有示例程序中,字符都被实例化为 classes,并使用如下代码:

class Character(object):
    def__init__(self,image,stuff):
        self.image = image
        self.stuff = stuff[:]

bob = Character(image,stuff)

我想知道使用 class 与仅使用普通列表相比有什么好处。我可以不使用 class 实例化而是创建一个这样的列表:

bob = [image,stuff[:]]

我想知道人们使用 classes 的原因是否是为了具有直接与角色交互的功能并且只是定义为 class 的一部分而不是作为单独的功能可以用在角色上。

谢谢!

一般来说,我会说它更清楚。使用 list,您最终会想 "what was at index 0? what was at index 1?" 等等。然后你必须通过代码回溯以找到定义 bob 的位置以确保。

此外,如果您在整个代码中创建其他字符,则必须以相同的方式创建它们。使用 class,您可以轻松地搜索代码库以创建角色并更新它(例如,如果您想向角色添加另一个 属性),如果您遗漏了任何一个,python 将抛出一个Exception 所以你知道在哪里修复它。有了这个列表,将很难找到并且 python 不会告诉您是否遗漏了任何信息 -- 您会得到一个奇怪的 IndexError,您需要追溯至根本原因这是更多的工作。

使用 class 时,您可以从其他 class 继承并创建 method,这不适用于 list。但是如果你知道你只会像你的 class Character 那样使用静态值,你可能会检查 namedtuple。这是一个如何使用它的简单示例:

from collections import namedtuple
Character = namedtuple('Character', 'image stuff')
bob = Character(image, stuff)

在这个简单的例子中,为什么要在列表 bob 上使用 class Bob

  • 轻松访问属性。 Bob.imagebob[0]更容易记住。列表越长越难

  • 代码可读性。我不知道 bob[7]=bob[3]+bob[6] 行的作用。使用 class,同一行变为 Bob.armor=Bob.shield+Bob.helmet,我知道它的作用。

  • 组织。如果某些函数仅用于字符,那么将它们声明在属性之后是可行的。 class 强制您将与角色相关的所有内容都放在同一个地方。

不过,您可以使用字典来代替列表:

bob = {"image":image, "stuff":stuff[:], ...}
bob["armor"]=bob["shield"]+bob["helmet"]

与 class 一样,您可以轻松访问属性并且代码可读。