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()

Это, конечно, неоднозначно. Другой способ (способ сделать это на С ++), который я могу придумать, - это

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, Helper и Controller есть __init__.py.


person Mayank    schedule 30.03.2013    source источник


Ответы (3)


Вы хотите импортировать User модули в пакет __init__.py files, чтобы сделать их доступными как атрибуты.

Итак, в Helper/__init_.py и Controller/__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()
person Martijn Pieters    schedule 30.03.2013

Один из способов - это просто:

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
person Andrew Gorcester    schedule 30.03.2013

Это также может помочь (сегодня боролся с подобной проблемой):

ShutterDeck
├── Controller
│   ├── __init__.py
│   └── User.py
├── Helper
│   ├── __init__.py
│   └── User.py
└── __init__.py

in 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>
person jaor    schedule 26.10.2013