2013-03-30 161 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> 
相关问题