我目前正在尝试使用PyGame编写一个多文件Python(2.6.5)游戏。问题是其中一个文件游戏控制台.py,需要能够对主文件导入的其他对象的实例调用方法主.py". 问题是我在主文件中有一个列表来保存所有游戏对象(玩家的飞船、敌舰、工作站等)的实例,但我似乎无法从该列表中调用方法。“游戏控制台.py“尽管我在做一个from pyconsole import *
”主.py“在主循环开始之前。难道这根本不可能,我应该使用M4将每个文件合并成一个单独的文件,然后字节码编译并测试/分发它吗?在
示例:
bash$ cat test.py
#!/usr/bin/python
import math, distancefrom00
foo = 5
class BarClass:
def __init__(self):
self.baz = 10
def get(self):
print "The BAZ is ", self.baz
def switch(self)
self.baz = 15
self.get()
bar = BarClass()
def main():
bar.switch()
print distancefrom00.calculate([2, 4])
if __name__ == '__main__': main()
bash$ cat distancefrom00.py
#!/usr/bin/python
import math
import test
def calculate(otherpoint):
return str(math.hypot(otherpoint[0], otherpoint[1]))+" (foo = "+str(test.foo)+"; "+test.bar.get()+")"
bash$ python test.py
The BAZ is 15
The BAZ is 10
Traceback (most recent call last):
File "test.py", line 24, in <module>
if __name__ == '__main__': main()
File "test.py", line 22, in main
print distancefrom00.calculate([2, 4])
File "/home/archie/Development/Python/Import Test/distancefrom00.py", line 8, in calculate
return str(math.hypot(otherpoint[0], otherpoint[1]))+" (foo = "+str(test.foo)+"; "+test.bar.get()+")"
TypeError: cannot concatenate 'str' and 'NoneType' objects
如果我对Python名称、类和所有这些东西的理解有点有限,那么NoneType意味着名称test.bar.get()
-因此,test.bar
-没有分配给任何东西。在
除了其他答案,请注意测试.py作为一个脚本,它是模块}和从
__main__
。当您从创建一个新的test
模块的test.py
从distancefrom00.py
导入时。^主脚本中的{distancefrom00.py
访问的test.bar
完全无关。它们甚至不是同一个类:一个是__main__.BarClass
,而另一个是test.BarClass
实例。在这就是为什么您得到两个输出15后跟10:主脚本
bar
调用了它的switch
方法,但是测试模块bar
没有被切换。在撇开循环导入不谈,将主脚本导入另一个模块有其自身的缺点。在
您是否正在实例化
pyconsole
中的pyconsole
中的对象?如果在pyconsole
中有一个名为PyConsole
的类,那么给它的__init__
方法一个接受游戏对象列表的参数。这样,pyConsole
对象将具有对这些对象的引用。在希望这有帮助。似乎您误解了Python处理导入模块的方式。在
这听起来好像依赖关系是错误的。一般来说,不应该调用“向后”到主文件。那个主.py应该是把其他东西粘在一起的胶水,不应该依赖它。从技术上讲,依赖关系应该形成directed acyclic graph。一旦在依赖关系图中找到一个循环,就将公共方面移到一个新文件中以打破循环。在
所以,把东西搬进来主.py'由使用'游戏控制台.py'到一个新的文件。然后有主.py'和'游戏控制台.py'导入新文件。在
相关问题 更多 >
编程相关推荐