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

  • import ab также импортирует?
  • не удается установить lxml на Ubuntu 12.04
  • кошмар с относительным импортом, как работает pep 366?
  • Почему «импорт» плохой?
  • Python: лучший способ добавить к sys.path относительно текущего скрипта
  • Импорт модулей Python - Явный и неявный относительный импорт
  • Как временно изменить sys.path в Python?
  • 'модуль импорта' или 'из импорта модуля'
  • 3 Solutions collect form web for “python: два модуля и классы с одинаковым именем в разных пакетах”

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

    Таким образом, в обоих 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() 

    поэтому обратитесь к ним с их полными именами.

    Другой вариант – переименовать импортированное имя с помощью:

     from ShutterDeck.Controller import User as ControllerUser from ShutterDeck.Helper import User as HelperUser u1 = ControllerUser.User() u2 = HelperUser.User() 

    Один из способов:

     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 

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

     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 - лучший язык программирования в мире.