26

コードを別のクラスに分けて、別のファイルに入れたい。ただし、これらのクラスは互いに依存しています。

main.py:

from lib import A, B

def main():
    a = A()
    b = B()
    a.hello()
    b.hello()

if __name__ == '__main__':
    main()

lib / _init_.py :

from a import A
from b import B

ライブラリ/a.py:

import lib.B

class A():
    def __init__(self):
        print "A"

    def hello(self):
        print "hello A"
        b = B()

lib/b.py:

import lib.A

class B():
    def __init__(self):
        print "B"

    def hello(self):
        print "hello B"
        a = A()

Pythonでそれを行うことは可能ですか?

編集:

次のエラー メッセージが表示されます。

pydev debugger: starting
Traceback (most recent call last):
  File "eclipse-python/plugins/org.python.pydev_2.7.1.2012100913/pysrc/pydevd.py", line 1397, in <module>
    debugger.run(setup['file'], None, None)
  File "eclipse-python/plugins/org.python.pydev_2.7.1.2012100913/pysrc/pydevd.py", line 1090, in run
    pydev_imports.execfile(file, globals, locals) #execute the script
  File "main.py", line 2, in <module>
    from lib import A, B
  File "lib/__init__.py", line 1, in <module>
    from a import A
  File "lib/a.py", line 1, in <module>
    import lib.B
ImportError: No module named B
4

4 に答える 4

30

上にモジュールをインポートする代わりに、hello 関数内で他のモジュールをインポートできます。

class B():
    def __init__(self):
        print "B"

    def hello(self):
        from lib import A
        print "hello B"
        a = A()
于 2013-06-21T00:40:42.023 に答える
9

あなたの主な問題は、クラスをインポートしようとしているが、モジュールをインポートするためだけに機能する構文を使用していることです。具体的には、 がモジュールで定義されている (および の最上位の名前空間にインポートされている) クラスであるimport lib.A場合、 は機能しません。Alib.alib

私が提案するのは、from _ import _本当に必要でない限り、構文を使用しないことです。これにより、依存関係の解決がはるかに簡単になります。

lib/a.py:

import lib.b # note, we're not importing the class B, just the module b!

class A():
    def foo(self):
        return lib.b.B() # use the class later, with a qualified name

lib/b.py:

import lib.a # again, just import the module, not the class

class B():
    def foo(self):
        return lib.a.A() # use another qualified name reference

lib/__init__.py:

from a import A # these imports are fine, since the sub-modules don't rely on them
from b import B # they can be the public API for the A and B classes

aパッケージの名前にb依存したくない場合は、相対モジュール インポートを使用することもできますlib

クラス A も B も、定義するために実際には他のクラスがまだ存在している必要がないため、これは確実に機能します。A のインスタンスがクラス B (およびその逆) について知る必要があるのは、それらがインポートされた後でのみです。

クラスの 1 つが他のクラスから継承された場合、または最上位で他のクラスのインスタンスを使用した場合、どのモジュールが最初にロードされたかについてより注意する必要があります。

于 2013-06-21T07:24:55.293 に答える