2013-03-30 8 views
17

Zacząłem uczyć się Pythona i pisać aplikację ćwiczeń. Struktura katalogów wyglądapython: Dwa moduły i klasy o tej samej nazwie w różnych pakietach

src 
| 
--ShutterDeck 
    | 
    --Helper 
     | 
     --User.py -> class User 
    --Controller 
     | 
     --User.py -> class User 

Katalog src jest PYTHONPATH. W innym pliku, powiedzmy main.py, chcę uzyskać dostęp do obu klas User. Jak mogę to zrobić.

Próbowałem za pomocą następujących, ale to się nie powiedzie:

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

To z pewnością niejednoznaczna. Drugi (C++ sposób to zrobić) sposób, że mogę myśleć jest

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

Ale kiedy Powyższy skrypt jest uruchamiany, to daje następujący błąd

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

nie jestem w stanie dowiedzieć się, dlaczego to pomija? Katalogi są w nich zapisane.

Odpowiedz

27

Chcesz zaimportować moduły w pliku pakietu __init__.py, aby udostępnić je jako atrybuty.

więc zarówno Helper/__init_.py i Controller/__init__.py dodają:

from . import User 

To sprawia, że ​​moduł atrybut pakietu i obecnie można o nim jako takie.

Alternatywnie, trzeba importować same moduły w całości:

import ShutterDeck.Controller.User 
import ShutterDeck.Helper.User 

u1=ShutterDeck.Controller.User.User() 
u2=ShutterDeck.Helper.User.User() 

więc odnosić się do nich z ich pełnymi nazwami.

Innym rozwiązaniem jest zmienić nazwę importowanego z as:

from ShutterDeck.Controller import User as ControllerUser 
from ShutterDeck.Helper import User as HelperUser 

u1 = ControllerUser.User() 
u2 = HelperUser.User() 
4

Jednym ze sposobów jest po prostu:

import ShutterDeck.Controller.User 
import ShutterDeck.Helper.User 

cuser = ShutterDeck.Controller.User.User() 
huser = ShutterDeck.Helper.User.User() 

Można też to zrobić:

from ShutterDeck.Controller.User import User as ControllerUser 
from ShutterDeck.Helper.User import User as HelperUser 
1

Może to również pomoc (zmagał się z podobnym problemem dzisiaj):

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

w ShutterDeck/{Controller,Helper}/__init__.py:

from .User import User 

A potem:

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