2013-03-30 21 views
17

Python'u öğrenmeye ve bir uygulama uygulaması yazmaya başladım. src dizin PYTHONPATH içindedir python: Farklı paketler altında aynı ada sahip iki modül ve sınıf

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

gibi dizin yapısı görünüyor. Farklı bir dosyada, main.py diyelim, hem User sınıflarına erişmek istiyorum. Nasıl yapabilirim.

Aşağıdaki ama başarısız kullanarak çalıştı: kesinlikle Belirsiz

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

. Aklıma gelen yolu diğer (bunu yapmanın C++ yolu) 'dir

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

Ama senaryo üzerinde çalıştırıldığında, bu

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

ben anlamaya muktedir değilim aşağıdaki hatayı veriyor neden hata yapıyor? ShutterDeck, Helper ve Controller dizinleri, bunlara __init__.py sahiptir.

cevap

27

User modüllerini __init__.py dosyalarında, onları nitelik olarak kullanılabilir yapmak için içe aktarmak istersiniz.

Yani hem Helper/__init_.py ve Controller/__init__.py eklemedeki:

from . import User 

Bu modül paketinin bir özellik yapar ve artık gibi buna başvurabilir.

Alternatif olarak, tam modülleri kendileri ithal etmek zorunda kalacak:

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

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

böylece tam isimlerini onlara bakın.

Başka bir seçenek as ile ithal adını yeniden adlandırmak için:

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

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

bir yolu adildir:

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

Bu aynı zamanda olabilir:

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

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

Ayrıca yapabilirsiniz Yardım (bugün benzer bir sorunla mücadele etti):

Sonra

from .User import User 

Ve:

ShutterDeck 
├── Controller 
│   ├── __init__.py 
│   └── User.py 
├── Helper 
│   ├── __init__.py 
│   └── User.py 
└── __init__.py 
ShutterDeck/{Controller,Helper}/__init__.py yılında

>>> 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> 
İlgili konular