python:不同包下同名的两个模块和类

Posted

技术标签:

【中文标题】python:不同包下同名的两个模块和类【英文标题】:python: Two modules and classes with the same name under different packages 【发布时间】:2013-03-21 04:17:12 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

一种方法就是:

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

【讨论】:

【参考方案3】:

这也可能有帮助(今天遇到类似问题):

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>

【讨论】:

以上是关于python:不同包下同名的两个模块和类的主要内容,如果未能解决你的问题,请参考以下文章

Ruby中同名的模块和类

Python 文件目录比较工具filecmp和difflib

过程,模块,函数,类,他们有啥不同?

在python opencv模块中编辑后保存同名图像

java中同一个包下的两个类含有多个重名的方法,有的需要互相调用,有的只能调用本类的,该如何实现?

python-装饰器