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

Но когда выполняется над script, он дает следующую ошибку

u1=Controller.User.User()
AttributeError: 'module' object has no attribute 'User'

Я не могу понять, почему это ошибка? Каталоги ShutterDeck, Helper и Controller имеют в них __init__.py.

Ответы

Ответ 1

Вы хотите импортировать модули 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()

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

Другой вариант - переименовать импортированное имя с помощью 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>