2

この質問は以前に尋ねられたことがありますが、それでもPythonモジュールの操作に頭を悩ませようとしています。私のアプリは非常に基本的な構造を持っています:

app/
   __init__.py
   driver.py
   dbloader/
     __init__.py
     loader.py

両方の__init__.pyファイルが空です。driver.py1つのクラスDriver()のみがあり、そのloader.py中にはクラスのみがありますLoader()

したがって、この設定をテストcdするには、app/ディレクトリ内に移動します。ここからPythonシェルを起動します。次に試してみます:

import dbloaderこれは機能します(つまり、エラーはありません)。ただし、内部のLoader()をインスタンス化するために、あらゆる順列を試しましたがloader.py、役に立ちませんでした。私が試したもののいくつかは次のとおりです。

from dbloader import loader
from dbloader.loader import Loader

私も試しました

dbloaderのみをインポートしてから、次のようにインスタンス化しようとします。

import dbloader
l = dbloader.Loader()

すべて無駄に。Pythonシェルを実行すると、現在のディレクトリとサブディレクトリが自動的にpythonpathに含まれることを他の場所で読んでいると思います(これは本当ですか?)

とにかく、どんな援助も大歓迎です。

4

3 に答える 3

3

dbloaderLoaderそれ自体では、クラスへの参照はありません。loaderただし、名前空間を通過する必要があります。したがって、次の 2 つの方法が考えられます。

from dbloader import loader
l = loader.Loader()

また

from dbloader.loader import Loader
l = Loader()

モジュールやクラスではなく、名前空間について考えると役立ちます。Loaderdbloader.loader名前空間にあり、そのクラスにアクセスするには、クラス自体またはそれを含むモジュールを現在の名前空間にインポートする必要があります。

于 2012-05-02T16:05:43.647 に答える
2

import XX名前空間に追加します。

import dbloader- これにより、モジュール が追加されますdbloader。あなたはあなたのクラスに着くでしょうdbloader.loader.Loader

from dbloader import loaderloader- これにより、モジュールが名前空間に追加されます。でクラスにアクセスしますloader.Loader

from dbloader.loader import LoaderLoader- これにより、クラスが名前空間にインポートされます。ここを使うだけLoader()です。

と を使って python シェルで遊んでみるdirhelp、構造が少しよく理解できるはずです。

于 2012-05-02T16:05:23.030 に答える
0

Daenyth と Daniel Roseman によって提案されたソリューションを使用することに加えて、dbloader でローダーを from-import する場合、からLoader直接アクセスできます。dbloader

# app/dbloader/__init__.py
from dbloader.loader import Loader

次に、シェルで次のようにします。

import dbloader
l = dbloader.Loader()

# or...

from dbloader import Loader
l2 = Loader()

これは、名前空間をクリーンアップするための優れたソリューションです。

于 2012-05-02T16:20:30.433 に答える