如何在Python中组织类?

3

我遇到了一个问题,感觉答案非常简单,但很难在短时间内通过谷歌搜索解决,我也没有找到关于这个主题的任何信息。

最近我正在开发一个游戏,在游戏中每个块/瓦片都有多种类型的对象:

    class Char(object):
        ...
        def update(self):
            ...
        def move(self, direction):
            ...

或者

    class Dirt(object):
        ...

显然,在主程序中定义所有这些类可能会非常混乱。例如,如果我想在游戏中创建一个名为“屏幕”的对象(计算机屏幕),那么这将与实际游戏窗口的屏幕类发生冲突。此外,创建一个名为gameObjects的第二个模块还会导致所有我的游戏对象无法访问在主程序中定义的变量。
那么,我应该如何组织或分组我的类呢?作为一名刚入门的Python学习者,希望得到简单明了的答案,谢谢。

这里应该是用小写的 class,而不是大写的 Class。按照现在的写法,会导致 SyntaxError 错误。 - abarnert
1个回答

4
通常情况下,你不会希望对象与你的类名称相同。如果它们在不同的作用域中定义,实际上并没有冲突,但这仍然会让人感到困惑。
但是,如果遵循典型的Python命名约定,这将不是问题:你的类以大写字母开头,变量以小写字母开头。因此,你的变量被称为“screen”,并且你有一个叫做“Screen”的类也没关系。
同时,你可能希望将相关的类放在一个模块中。在你的“gameObjects”模块中定义的类的对象将无法访问主函数中定义的变量,但你也不希望它们这样做。全局变量几乎总是一个不好的想法。如果对象需要访问变量,请将该变量传递到它的构造函数中。
在创建自己的大型项目之前,你应该看一看其他几个大型项目,了解它们如何组织事物。

问题是,这不是一个变量屏幕,而是一个窗口的Screen ,不是一个变量。您是否建议我将我的"Character"和"Dirt"类与我的main函数处于相同的levelscope上,我不确定这是否被认为是混乱的,但对我来说确实很难理解。 - Parker Hoyes
1
啊,你在问是否合理地使用类名,例如,mygame.environment.Screen 代表计算机显示器,mygame.windowing.Screen 代表游戏窗口?是的,有时候这是合理的。在这种特定情况下,名称确实令人困惑(游戏窗口可能应该被称为 WindowGameWindow 或其他类似的名称),但我可以想象到比如克林贡族出现在其中的游戏内视屏可能被称为 Screen,这将引起相同的问题。这实际上是将事物分解成模块的好处之一。 - abarnert
1
对于问题的另一半:字符(Character)和污垢(Dirt)是否与主函数在同一个作用域中,这实际上取决于系统的复杂程度。但我猜测在你的情况下,它们不应该属于同一个作用域;它们应该属于被主函数导入的模块中。 - abarnert
谢谢,这就是我想知道的。还有一件事,创建一个类而不是一个模块,然后将该类用作模块的实例,这样做是否合理?或者这样做完全不可接受?因为这样可以解决无法从main访问变量的问题。 - Parker Hoyes
1
main函数中,通过创建一个namedtuple来解决这个问题,其中包含你需要的变量,并在实例化类时将它们传递给类。组织是关键。 - kreativitea
1
这是_可能的_,但不是一个好主意。不要滥用类作为模块。尤其不要将其用作解决访问全局变量问题的方法-正确的解决方法是摆脱全局变量,并将它们放在适当的位置,并建立良好定义的访问链。再次强调,显而易见的方法是只需通过构造函数将它们(或包含它们的对象)传递给需要它们的任何对象。 - abarnert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接