如何在Python中创建全局类(如果可能)?

Noa*_*h R 4 python class

让我们假设我有一些RPG的功能我正在努力......

def name_of_function():
     action
Run Code Online (Sandbox Code Playgroud)

并希望在每个函数中实现ax类(见下文),而不必重写每个类.我如何将该类创建为全局类.我不确定我是否使用了正确的术语,但请帮忙.这总是让我难以创建基于文本的RPG游戏.一个全球类的例子真棒!

class axe:
    attack = 5
    weight = 6
    description = "A lightweight battle axe."
    level_required = 1
    price = 10
Run Code Online (Sandbox Code Playgroud)

Rob*_*ney 7

你无法在Python中创建任何真正全局的东西 - 也就是说,无论如何,任何模块都可以神奇地使用它.但是一旦你理解了模块和导入的工作方式,这几乎不重要.

通常,您创建类并将它们组织到模块中.然后将它们导入到需要它们的任何模块中,这会将类添加到模块的符号表中.

因此,例如,您可以创建一个名为模块weapons.py,并创建一个WeaponBase在它的类,然后AxeBroadsword类衍生WeaponsBase.然后,在任何需要使用武器的模块中,你都会放弃

import weapons
Run Code Online (Sandbox Code Playgroud)

在文件的顶部.执行此操作后,weapons.Axe返回Axe类,weapons.Broadsword返回Broadsword类,依此类推.你也可以使用:

from weapons import Axe, Broadsword
Run Code Online (Sandbox Code Playgroud)

这增加AxeBroadsword到模块的符号表,使代码几乎做你想要它做你说的到底是什么.

你也可以使用

from weapons import *
Run Code Online (Sandbox Code Playgroud)

但由于两个原因,这通常不是一个好主意.首先,它会导入模块中的所有内容,无论您是否要使用它 - WeaponsBase例如.其次,如果有weapons一个函数与导入模块中的函数同名,则会遇到各种令人困惑的问题.

系统中有很多细微之处import.例如,您必须小心确保模块不会尝试相互导入.最终你的项目变得足够大,你不想把它的所有模块放在同一个目录中,你将不得不学习类似的东西__init__.py.但你可以担心这一点.

  • @Rafe - 使用`global`关键字声明的变量仍然是模块范围的.你不能在`bar.py`中说'global foo`并让'baz.py`识别它. (3认同)