7

我是编程新手,我做了一个小程序来学习如何使用 python,我做了这个。

如果我将它放在一个文件中,它就可以正常工作,但是当我将它分成三个文件时,分别称为 Atlas.py、Robot.py 和 Test.py。

我在初始化行的机器人类中收到一个错误:“未定义的变量:Atlas” 。

我已经在上面的评论中评论了它所在的文件。

#Atlas.py
class Atlas:

def __init__(self):
    self.robots = []
    self.currently_occupied = {}

def add_robot(self, robot):
    self.robots.append(robot)
    self.currently_occupied = {robot:[]}


#Robot.py
class Robot():

def __init__(self, rbt, atlas = Atlas): #This is the main error:"Undefined Variable: Atlas" This happens after i separate the file
    self.xpos = 0
    self.ypos = 0
    self.atlas = atlas()
    self.atlas.add_robot(rbt)
    self.name = rbt

def walk(self, axis, steps=2):
    ....

#Test.py
robot1 = Robot("robot1")

我将这些类放入相应的文件中,Test.py 现在看起来像这样:

#Test.py
import Robot
robot1 = Robot("robot1")
4

3 回答 3

4

在 Robot.py 中,您的第一行应该是(假设文件名为 Atlas.py):

from Atlas import Atlas

意思是“从 Atlas.py 文件(也称为 Atlas 模块)导入 Atlas 类”,因此 Atlas 变量在 Robot.py 文件(也称为 Robot 模块)中可用。

IOW,如果您需要另一个文件中的 Robot 类(并且它仍然存在于 Robot.py 的 Robot 模块中),您需要将“from Robot import Robot”添加到该新文件中。

我建议你尽可能多地阅读Python 教程。否则,您当前的问题更直接与modules相关,因此请阅读该部分。

于 2012-05-18T01:47:15.610 回答
2

Python 在这方面很酷,因为理解会引导您了解为什么 Python 会随着您的学习而变得更简单。

Python 只是在命名空间字典中从上到下执行脚本。

在第一个示例中,您的代码如下所示:

a 10 line class statement adds Atlas to the default namespace
a 12 line class statement adds Robot to the default namespace
robot1 = Robot("robot1")

最后一行真的被重写为函数调用:

robot1 = default_namespace.Robot.init("robot1") 
# plus a bit of magic to create an instance and grab the return value.

这是因为 Robot 类是它自己的 Class 类型的命名空间。

当您分离文件并点击以下代码时:

import Robot

它的意思是:

if we haven't already imported the module Robot:
    find the file named Robot.py
    execute it, line by line, and keep the kept_namespace
    default_namespace.Robot = kept_namespace

所以,在我们的主线测试中:

>>> print type(Robot), dir(Robot)
<type 'module'>, [..., 'Robot']
>>> print type(Robot.Robot), dir(Robot.Robot)
<type 'classobj'>, [..., '__init__', 'walk']
>>> robot1 = Robot.Robot("robot1")

为了让它更简单或更容易混淆,默认的命名空间、模块和类都是 dict 对象,带有一点打字魔法来减少编码错误。

于 2012-05-18T02:20:53.513 回答
0

使用import,您正在将不同的命名空间导入到当前正在运行的脚本命名空间中。

以身份访问类Robot.Robot("robot 1")或使用import robots as robots.

于 2012-05-18T01:44:16.523 回答