2010-12-11 28 views
0

“”“制作我的IF(Interactive Fiction)模块的更好版本,以便您可以创建一个导入它的模块,并且您可以开始添加废话 三件事情 - 如果您计算DEBUG变量,那么就是四个 - 变量PLAYER_NAME,PLAYER_LOCATION和PLAYER_INVENTORY。在基础中,它们是“Luke”,无和列表 冒险内容模块使用“from mask_IF import *”,改变任何这些变量使它在当前命名空间中 - 它不会改变导入的。 由于*,我也不能mask_IF.VARIABLE =值。Python - 如何更改导入为“from module import *”的模块中的变量

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

==== 在主要模块:

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没有给出 的对象2没有给出

回答

3

你不能做到这一点,对于原因,你给。它可以通过创建具有适当属性的对象来模拟,但是您可能不会导入*开头。

0

是的,你不能这样做。 “from mask_IF import *”正在当前模块中创建一个名为PLAYER_NAME的新变量,恰好指向相同的底层数据。它是而不是 mask_IF模块中的变量的别名。当您尝试为PLAYER_NAME分配其他内容时,您告诉局部变量指向新的东西,这对mask_IF变量指向的内容没有任何影响。

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 *

相关问题