Python - 如何更改导入为“from module import *”的模块中的变量

时间:2010-12-11 23:03:40

标签: python

“”“制作我的IF(互动小说)模块的更好版本,这样您就可以创建一个导入它的模块,然后就可以开始添加垃圾了 三件事 - 如果你算上DEBUG变量那么四个 - 变量PLAYER_NAME,PLAYER_LOCATION和PLAYER_INVENTORY。在基地他们是“卢克”,无,和列表 冒险内容模块使用“from mask_IF import *”,更改任何变量使其在当前命名空间中 - 它不会改变导入的变量。 由于*,我不能使用mask_IF.VARIABLE = value。

我想保留我的“来自mask_IF import *”,但同时我有这些变量应该用每个单独的冒险模块定义并在主模块中使用。 “”“

==== 在主要模块中:

PLAYER_NAME = "Luke"
...
class ActionHelp(Action):
    def ActionHandle(self, Object1, Object2):
        print "No help for you, " + PLAYER_NAME + "!"

在冒险模块中:

from mask_IF import *
Text("Your name is normally " + PLAYER_NAME)
...
PLAYER_NAME = "Adventure_Tester #001"
Text("But today you are " + PLAYER_NAME)

==== 你的名字通常是卢克 但今天你是Adventure_Tester#001

  

帮助   卢克,对你没有帮助!   命令是帮助   Object1没有GIVEN   Object2不是GIVEN

3 个答案:

答案 0 :(得分:3)

由于你给出的原因,你不能这样做。可以通过创建具有适当属性的对象来模拟它,但是您也可以不导入*开始。

答案 1 :(得分:0)

是的,你不能这样做。 “from mask_IF import *”正在当前模块中创建一个名为PLAYER_NAME的新变量,该变量恰好指向相同的基础数据。 不是 mask_IF模块中变量的别名。当您尝试将其他内容分配给PLAYER_NAME时,您告诉本地变量指向新的内容,这对于mask_IF变量指向的内容完全没有影响。

答案 2 :(得分:0)

如果您使用StrObj之类的对象而不是字符串,那么您将处理一个可变类型引用,该引用可以从任何地方更新值。您的代码唯一的区别在于通过调用Set()而不是= '...'来设置它。

class StrObj(object):
    def __init__(self, value=''):
        self.value = value
    def __add__(self, other):
        return other + self.value
    def Set(self, value):
        self.value = value

假设在mask_IF.pyPLAYER_NAME = StrObj('Some Name') ...

from mask_IF import *
Text("Your name is normally " + PLAYER_NAME)
...
PLAYER_NAME.Set("Adventure_Tester #001")
Text("But today you are " + PLAYER_NAME)

所有这一切......

我认为你最好定义一个Player对象,其中包含NAME等属性......而只是使用它。我建议稀疏地使用import *