7

私はプログラミングが初めてで、Pythonの使い方を学ぶためだけに小さなプログラムを作成し、これを作成しました。

1 つのファイルにまとめれば問題なく動作しますが、Atlas.py、Robot.py、Test.py という 3 つのファイルに分けるとうまくいきます。

初期化行のロボット クラスに「未定義変数: アトラス」というエラーが表示されます。

すぐ上のコメントで、どのファイルに含まれているかをコメントしました。

#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 に答える