2

我目前正在尝试使用 PyGame 编写多文件 Python (2.6.5) 游戏。问题是其中一个文件“pyconsole.py”需要能够调用由主文件“main.py”导入的其他对象的实例上的方法。问题是我在主文件中有一个列表来保存所有游戏对象(玩家的船、敌船、车站等)的实例,但我似乎无法从该列表中调用方法“pyconsole.py”尽管我在from pyconsole import *主循环开始之前在“main.py”中做一个。这根本不可能吗,我是否应该使用 M4 将每个文件组合成 1 个单个文件,然后进行字节码编译和测试/分发?

例子:

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- 没有分配给任何东西。

4

4 回答 4

2

问题是其中一个文件“pyconsole.py”需要能够调用由主文件“main.py”导入的其他对象的实例上的方法。

这听起来像是依赖关系是错误的。一般来说,什么都不应该调用“向后”到主文件。那个 main.py 应该是把其他所有东西粘在一起的粘合剂,任何东西都不应该依赖它。从技术上讲,依赖关系应该形成一个有向无环图。一旦你在依赖图中找到了一个循环,就将共同的方面移到一个新文件中以打破循环。

因此,将“pyconsole.py”使用的“main.py”中的内容移到一个新文件中。然后让“main.py”和“pyconsole.py”导入该新文件。

于 2010-07-26T13:41:50.173 回答
1

除了其他答案之外,请注意,当您将 test.py 作为脚本运行时,它是 module __main__。当您从中导入test.pydistancefrom00.py,会创建一个新test模块。bar在主脚本中和test.bar可访问的地方distancefrom00.py是完全不相关的。它们甚至不是同一个类:一个是一段__main__.BarClass时间,另一个是test.BarClass实例。

这就是为什么你得到两个输出 15 和 10:主脚本bar已经switch调用了它的方法,但是测试模块bar没有被切换。

除了循环导入之外,将主脚本导入另一个模块有其自身的不良程度。

于 2010-07-26T14:31:28.653 回答
0

pyconsole您是否在in 中实例化一个对象main.py?如果你有一个调用PyConsolein的类pyconsole,给它的__init__方法一个参数,该参数接受游戏对象的列表。这样,您的pyConsole对象将具有对对象的引用。

希望这可以帮助。您似乎误解了 Python 处理导入模块的方式。

于 2010-07-26T13:40:55.510 回答
0

提交代码的问题是类的get方法BarClass返回值 of,None因为方法的主体只包含一个打印语句。因此,distancefrom00.py函数的结果calculate是:

str + str + str + str + None + str

因此,TypeError: cannot concatenate a 'str' and 'NoneType' objects

您可以通过从对 的调用返回一个字符串来解决此问题get。例如,

def get(self):
    return "The BAZ is %s" % self.baz

另外,请注意,您的两个文件中有一个循环导入。test.py进口distancefrom00.pydistancefrom00.py进口test.py。正如 Kylotan 所说,循环依赖是不好的

于 2010-07-26T14:16:07.693 回答