2013-03-30 158 views
17

我已經開始學習python並編寫一個練習應用程序。目錄結構看起來像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,HelperController在其中具有__init__.py

回答

27

想要將User模塊導入包__init__.py文件中,以使它們可用作屬性。

所以在這兩個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() 
4

的一個方法是:

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 
1

這也可能幫助(今天與類似的問題掙扎):​​

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> 
相關問題