module heeft geen attribuut

Ik heb een map met een aantal .pybestanden erin. elk bestand definieert enkele klassen. Ik heb ook een lege __init__.pyin de directory.

Bijvoorbeeld:

myproject
    __init__.py
    mymodule
        __init__.py
        api.py
        models.py
        views.py

Ik probeer mymodulete importeren en toegang te krijgen tot de klassen die in al deze bestanden zijn gedefinieerd:

from myproject import mymodule
print mymodule.api.MyClass 

Ik krijg een foutmelding dat mymodulegeen attribuut apiheeft. Waarom? En waarom heb ik slechts toegang tot een van de bestanden (models.py) en niet tot de andere?

In [2]: dir(banners)
Out[2]:
['__builtins__',
 '__doc__',
 '__file__',
 '__name__',
 '__package__',
 '__path__',
 'models']

Antwoord 1, autoriteit 100%

Het probleem is dat submodules niet automatisch worden geïmporteerd. U moet de module apiexpliciet importeren:

import myproject.mymodule.api
print myproject.mymodule.api.MyClass

Als je er echt op staat dat apibeschikbaar is bij het importeren van myproject.mymodule, kun je dit in myproject/mymodule/__init__.pyplaatsen:

import myproject.mymodule.api

Dan werkt dit zoals verwacht:

from myproject import mymodule
print mymodule.api.MyClass 

Antwoord 2, autoriteit 13%

Als je een idioot bent, zoals ik, controleer dan ook of je je python-bestand niet dezelfde naam hebt gegeven als de module die je probeert te importeren.


Antwoord 3

Modules werken niet zo.

from myproject.mymodule import api
print api.MyClass

Antwoord 4

Je hebt ook een __init__.pynodig in de map myproject. Dus je modulestructuur zou moeten zijn:

myproject
    __init__.py
    mymodule
        __init__.py
        api.py
        models.py
        views.py

Other episodes