pythonを学び、練習用アプリを書き始めました。ディレクトリ構造は次のようになります
src
|
--ShutterDeck
|
--Helper
|
--User.py -> class User
--Controller
|
--User.py -> class User
src
ディレクトリはPYTHONPATH
にあります。別のファイルで、main.py
、両方のUser
クラスにアクセスしたい。どうすればできますか。
以下を使用してみましたが失敗します:
import cherrypy
from ShutterDeck.Controller import User
from ShutterDeck.Helper import User
class Root:
@cherrypy.expose
def index(self):
return 'Hello World'
u1=User.User()
u2=User.User()
それは確かにあいまいです。私が考えることができる他の(C++のやり方)方法は
import cherrypy
from ShutterDeck import Controller
from ShutterDeck import Helper
class Root:
@cherrypy.expose
def index(self):
return 'Hello World'
u1=Controller.User.User()
u2=Helper.User.User()
しかし、上記のスクリプトを実行すると、次のエラーが発生します
u1=Controller.User.User()
AttributeError: 'module' object has no attribute 'User'
エラーが発生する理由を理解できません。ディレクトリShutterDeck
、Helper
およびController
には__init__.py
。
__init__.py
ファイル内のUser
モジュールをインポートして、属性として使用できるようにします。
したがって、Helper/__init_.py
とController/__init__.py
の両方に追加:
from . import User
これにより、モジュールがパッケージの属性になり、そのように参照できるようになります。
または、モジュール全体を完全にインポートする必要があります。
import ShutterDeck.Controller.User
import ShutterDeck.Helper.User
u1=ShutterDeck.Controller.User.User()
u2=ShutterDeck.Helper.User.User()
フルネームでそれらを参照してください。
別のオプションは、インポートされた名前をas
に変更することです:
from ShutterDeck.Controller import User as ControllerUser
from ShutterDeck.Helper import User as HelperUser
u1 = ControllerUser.User()
u2 = HelperUser.User()
1つの方法は次のとおりです。
import ShutterDeck.Controller.User
import ShutterDeck.Helper.User
cuser = ShutterDeck.Controller.User.User()
huser = ShutterDeck.Helper.User.User()
これを行うこともできます:
from ShutterDeck.Controller.User import User as ControllerUser
from ShutterDeck.Helper.User import User as HelperUser
これも役立つかもしれません(今日同様の問題に悩まされています):
ShutterDeck
├── Controller
│ ├── __init__.py
│ └── User.py
├── Helper
│ ├── __init__.py
│ └── User.py
└── __init__.py
ShutterDeck/{Controller,Helper}/__init__.py
:
from .User import User
その後:
>>> import ShutterDeck.Helper
>>> helperUser = ShutterDeck.Helper.User()
>>> helperUser
<ShutterDeck.Helper.User.User object at 0x1669b90>
>>> import ShutterDeck.Controller
>>> controllerUser = ShutterDeck.Controller.User()
>>> controllerUser
<ShutterDeck.Controller.User.User object at 0x1669c90>