python:在不同的包下具有相同名称的两个模块和类

时间:2013-03-30 16:06:31

标签: python python-3.x package python-import

我已经开始学习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'

我无法弄清楚为什么会出错?目录ShutterDeckHelperController中包含__init__.py

3 个答案:

答案 0 :(得分:31)

您要导入包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()

答案 1 :(得分:5)

一种方法就是:

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

答案 2 :(得分: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>