Python访问父对象实例

2024-06-26 18:04:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在尝试使用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-没有分配给任何东西。在


Tags: 文件pytestimportself游戏getfoo
3条回答

除了其他答案,请注意测试.py作为一个脚本,它是模块__main__。当您从创建一个新的test模块的test.pydistancefrom00.py导入时。^主脚本中的{}和从distancefrom00.py访问的test.bar完全无关。它们甚至不是同一个类:一个是__main__.BarClass,而另一个是test.BarClass实例。在

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

撇开循环导入不谈,将主脚本导入另一个模块有其自身的缺点。在

您是否正在实例化pyconsole中的pyconsole中的对象?如果在pyconsole中有一个名为PyConsole的类,那么给它的__init__方法一个接受游戏对象列表的参数。这样,pyConsole对象将具有对这些对象的引用。在

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

The problem is that one of the files, "pyconsole.py", needs to be able to call methods on instances of other objects imported by the primary file, "main.py".

这听起来好像依赖关系是错误的。一般来说,不应该调用“向后”到主文件。那个主.py应该是把其他东西粘在一起的胶水,不应该依赖它。从技术上讲,依赖关系应该形成directed acyclic graph。一旦在依赖关系图中找到一个循环,就将公共方面移到一个新文件中以打破循环。在

所以,把东西搬进来主.py'由使用'游戏控制台.py'到一个新的文件。然后有主.py'和'游戏控制台.py'导入新文件。在

相关问题 更多 >