1

プログラミングの経験はありますが、Python は初めてで、メイン以外の .py ファイルからクラスを使用およびインポートする方法を理解しようとしています。現在、CPython 3.2.1 を実行している netbeans を使用しています。

現在のセットアップでは、すべての .py ファイルが同じフォルダーにあります。実際の内容を無視すると、次のようになります。

pythonprogram.py

from otherfile import *
obj = classB()
print(obj.run())

def method1():
   dostuff

otherfile.py

import pythonprogram

class classA:
   def __init__(self, thing1=None, thing2=None):
       self.thing1 = thing1
       self.thing2 = thing2
   def run():
       pythonprogram.method1()
       return something

class classB(classA):
    def __init__(self):
        super(thing1=None, thing2=None) #this will be more meaningful later
    def run():
        do some stuff
        return super().run()

obj を作成する行に到達すると、次のエラーが発生します。

Traceback (more recent call last):
    C:\users\me\projects\pythonprogram.py in line 4 in <module>
        from room import *
    C:\users\me\projects\otherfile.py in line 4 in <module>
        import pythonprogram
    C:\users\me\projects\pythonprogram.py in line 13 in <module>
        obj = classB()

Python に慣れていないので、誰かが私の super の使用が正しいかどうかを私に知らせたいと思うかもしれません。

私が抱えているエラーに直接関連するチュートリアルや別の質問を見つけるのに苦労しましたが、それはおそらく私がPythonに慣れていないため、見たときに見落としているためです。したがって、誰かが私に適切なチュートリアルを教えてくれれば、それも結構です。

それ以外の場合は、すべてをどのようにセットアップするか、およびどのように修正する必要があるかという点で、私が間違っていることを知りたいだけです。

お役に立てれば、私は最初に Java で学び、C# と C++ も使用できるようになりました。

4

3 に答える 3

2

問題は循環インポートが原因です。この点に関して、Python は他のいくつかの言語よりも柔軟性に欠けています。あなたの場合、pythonprogram前からrequireclassBを定義できます。ただし、定義する前に必要です。otherfilemethod1otherfilemethod1classB

import行をモジュールのさらに下に移動することで、循環インポートを解決できる場合があります。しかし、これを解決する最善の方法は、モジュール間の双方向の依存関係を完全に回避することです。通常、これにより、よりクリーンで優れた設計のプログラムが作成されます。

于 2011-08-10T21:59:52.910 に答える
0

pythonprogram.pyをモジュールとして使用する場合は、次のように変更できます。

from otherfile import *

def method1():
   print "dosomthing"

if __name__ == "__main__":
    obj = classB()
    print(obj.run())

pythonprogram.pyを実行すると、条件name == " main "はtureになり、他のモジュールからpythonprogramをインポートすると、name ==" main "はfalseになります。

于 2011-08-10T22:15:52.493 に答える
0

最も基本的なレベルでは、定義する前に呼び出そmethod1()うとしています。

本質的に、あなたは を呼び出してclassBおり、それは を呼び出しclassA、それは を呼び出そうとしますが、定義される前の行method1で最初のことを行っています。classB()method

この混乱から抜け出す最も簡単な方法は、実際に処理を行うコードの部分を除くすべてをファイルの最後に移動することです。

于 2011-08-10T22:24:09.960 に答える