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>