web-dev-qa-db-ja.com

python:異なるパッケージで同じ名前の2つのモジュールとクラス

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'

エラーが発生する理由を理解できません。ディレクトリShutterDeckHelperおよびControllerには__init__.py

24
Mayank

__init__.pyファイル内のUserモジュールをインポートして、属性として使用できるようにします。

したがって、Helper/__init_.pyController/__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()
37
Martijn Pieters

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
8

これも役立つかもしれません(今日同様の問題に悩まされています):

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>
1
jaor